μ λ ¬ μκ³ λ¦¬μ¦ κ΄λ ¨ κΈ°λ³Έ μ 리
μ±λ₯ μꡬμ¬νμ΄ μκ±°λ, nμ΄ μμ λ μ¬μ©νλ λ°©μ. ꡬνμ μμ΄λ²λ¦΄ μ μμλ§νΌ κ°λ¨νλ€.
void selSort(T arr[], int size) {for(int i = 0; i < size; ++i) {for(int j = i + 1; j < size; ++j) {if (arr[i] > arr[j]) {T tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}}}}
λ°μ΄ν°κ° λ€μͺ½μΌλ‘ 1κ°μ© μΆκ°λλ κ²½μ°μ, O(n)μΌλ‘ μ μΌ λΉ λ₯΄λ€. λν memory
μ locality
λ₯Ό μ΄λ¦΄ μ μλ λ°©μμΌλ‘ μ λͺ
νλ€.
μ΄ λ°©μμ, i-1
λ²μ§ΈκΉμ§ μμλ€μ΄ μ΄λ―Έ μ λ ¬λμ΄μλ€κ³ κ°μ νκ³ , iλ²μ¨° μμλ₯Ό μ μ ν κ³³μ μ½μ
νλ λ°©μμ΄λΌμ, Insertion sort
λΌκ³ λΆλ¦°λ€. μ΄ λ°©μμ κ²½μ° swap
λ³΄λ€ assign
μ°μ°μ 1ν μ€μΌ μ μμ΄μ λ λΉ λ₯΄λ€. μ€μ λ‘, O(n^2)
μκ³ λ¦¬μ¦ μ€μ μ μΌ λΉ λ₯΄λ€κ³ ν μ μλ€.
void insertionSort(T arr[], int size) {for(int i = 1; i < size; ++i) {T tmp = arr[i]; // λΉκ΅νκ³ μ νλ μμλ₯Ό μμλ‘ μ μ₯νλ€.int j = i - 1;for(; j >= 0; --j) { // j μμΉλ₯Ό 0κΉμ§ κ°λ©΄μ μ½μ ν κ³³μ μ°Ύλλ€.if (arr[j] < tmp) break;arr[j+1] = arr[j]; // swap λμ μ, λ€μͺ½μΌλ‘ μμλ₯Ό 1κ° λ―Όλ€.}arr[j+1] = tmp; // μ΅μ’ λͺ©μ μ§μ μμλ‘ μ μ₯ν μμλ₯Ό λ£κ³ λ§λ¬΄λ¦¬νλ€.}}
stable
νμ§λ μμ§λ§, μμ±μ΄ μ½κ³ λλ€ν λΆν¬λ₯Ό κ°μ§λ λ°μ΄ν°μ λν΄μ μ±λ₯μ΄ λΉ λ₯΄λ€. μλ μ½λμ ꡬκ°μ [s, e] μ΄λ€.
void qSort(T arr[], int s, int e) {int l = s, r = e;T pivot = arr[(s + e) >> 1];while(l < r) {while(arr[l] < pivot) ++l;while(pivot < arr[r]) --r;if (i > j) break;T tmp = arr[l];arr[l] = arr[r];arr[r] = tmp;++l; --r;}qSort(arr, s, r);qSort(arr, l, e);}
stable
ν μ λ ¬ μ€μ μ μΌ λΉ λ¦. μμ μ . worst
μλ O(n log n)
μ΄ λ³΄μ₯λμ΄ PS
μμ μμ£Ό μ°μΈλ€. Quick Sort
λλΉ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ 2λ°°μ΄κΈ° λλ¬Έμ, κ°μΈμ μΌλ‘λ λ μ νΈνλ νΈμ΄μ§λ§, stable
μ΄ νμν κ²½μ°μλ μ΄μ© μ μμ΄ μ¬μ©λμ΄μΌ νλ€.
ꡬκ°μ λ§μ°¬κ°μ§λ‘ [s, e] λ‘ λλλ κ²μ΄ μκ°νκΈ°μ κ°λ¨νλ€.
T tmp[MAX_SIZE];void mergeSort(T arr[], int s, int e) {if (s >= e) return;int mid = (s + e) >> 1;mergeSort(arr, s, mid);mergeSort(arr, mid + 1, e);int i = s, j = mid + 1;int k = s;for(;i <= mid && j <= e;) {if (arr[i] < arr[j])tmp[k++] = arr[i++];elsetmp[k++] = arr[j++];}for(;i <= mid; ++i, ++k)tmp[k] = arr[i];for(;j <= e; ++j, ++k)tmp[k] = arr[j];for(i = s; i <= e; ++i)arr[i] = tmp[i]; // realloc}
λ±ν λ λΉ λ₯΄μ§ μμ§λ§ λλνμ μ μν΄ μλμ κ°μ μ½λ μΆμ½ λ²μ λ νλ² κΈ°μ΅ν΄λ³΄μ. λ 쑰건μ λ§μ‘±ν λ i++
λ₯Ό μ°κ³ , λλ¨Έμ§μ κ²½μ° j++
λ₯Ό μ°λ κ². i++
μ μ¬μ©μ‘°κ±΄λ§ μ ν΄μ§λ©΄ λλ¨Έμ§λ j++
κ° λλ κ²μ μ°©μνλ€.
arr[i] <= arr[j]
μΌ λ. (λ±νΈ μ‘°κ±΄μ΄ μμ΄μΌ stableμ΄λ€)μ΄λ κ² μΆμ½νλ©΄, Quick Sort
λ³΄λ€ μ€νλ € μ½λ μμ±λμ΄ μ λ€.
T tmp[MAX_SIZE];void mergeSort(T arr[], int s, int e) {if (s >= e) return;int mid = (s + e) >> 1;mergeSort(arr, s, mid);mergeSort(arr, mid + 1, e);int i = s, j = mid + 1;int k = s;for(;k <= e;++k)// μλμμ arr[i] <= arr[j] μ κ΄νΈκ° λΉ μ§μ§ μμμΌ stable μμ μ μ!tmp[k] = ((j > e) || (i <= mid) && (arr[i] <= arr[j])) ? arr[i++] : arr[j++];for(i = s; i <= e; ++i)arr[i] = tmp[i]; // realloc}
Radix Sort
, Bucket Sort
λͺ¨λ κ°μ κ°λ
μ΄λ€. ννλ€ 10μ§λ²
μ Radix Sort
μ μ¬μ©νκ³€ νλλ°, μ¬μ€ κ·Έλ΄ νμκ° μλ€. λ©λͺ¨λ¦¬ 곡κ°μ ν¨μ¬ λ λ§μ΄ μ¬μ©ν μ μμΌλ―λ‘, 65536μ§λ² = 1<<16 μ§λ²
μ μ¬μ©νμ¬, short
λ§νΌμ 1 << 16
λ°°μ΄μ Counting ν΄μ λ£λ λ°©μμΌλ‘ λ°λ³΅νλ©΄, int
λ²μμ μλ μ½κ² μ λ ¬ν μ μλ€. Counting ν λ°°μ΄μ μ΄μ©νλ©΄, μ΄ μκ°λ³΅μ‘λ O(n)
μ μ λ ¬μ΄ μμ±λλ€. (μ ννλ λ¬Όλ‘ O(n)
μ μμλ°° λκ² λ€) μ¬μ€ μ μκ³ λ¦¬μ¦λ€κ³Ό λΉκ΅νλ©΄ λ§λ μλ μ λλ‘ λΉ λ₯Έ μκ³ λ¦¬μ¦μ΄λΌκ³ λ³Ό μ μλ€.
μ΄ κ²½μ° T
type genericμ μΈ μ μκ³ , ꡬ체μ μΈ λ²μμ μ λ²μκ° νμνλ€. κ°μ₯ κ°λ¨ν unsigned intμ μμκ° μλμ κ°λ€.
unsigned int cnt[1<<16 | 1];unsigned int acc[1<<16 | 1];unsigned int tmp[ARR_SIZE];unsigned int cnt2[1<<16 | 1];unsigned int acc2[1<<16 | 1];void bucketSort(unsigned int arr[]) {// νμ λΆλΆ μ λ ¬for(int i = 0; i < ARR_SIZE; ++i)cnt[arr[i] & 0xFFFF]++;for(int i = 1; i <= (1<<16); ++i)acc[i] = acc[i - 1] + cnt[i - 1];for(int i = 0; i < ARR_SIZE; ++i)tmp[acc[arr[i] & 0xFFFF]++] = arr[i];// μμ λΆλΆ μ λ ¬for(int i = 0; i < ARR_SIZE; ++i)cnt2[arr[i] >> 16]++;for(int i = 1; i <= (1<<16); ++i)acc2[i] = acc2[i - 1] + cnt2[i - 1];for(int i = 0; i < ARR_SIZE; ++i)arr[acc[tmp[i] >> 16]++] = tmp[i];}
νμ bit -> μμ bit μμΌλ‘ μ λ ¬μ νλ μ΄μ λ μμ bitμ μν₯λ ₯μ΄ λ ν¬κΈ° λλ¬Έμ΄λΌκ³ μ΄ν΄νλ©΄ μ½λ€.