voidQuickSort(vector<int>& arr, size_t left, size_t right){ if (left - right >= 2) { int i = left; int j = right + 1; int tmp = arr[left]; // Using first element as pivot is not recommend while (i < j) { while (arr[--j] > tmp); while (arr[++i] < tmp); if (i < j) swap(arr[i], arr[j]); else break; } swap(arr[left], arr[j]); QuickSort(arr, left, j - 1, cnt + 1); QuickSort(arr, j + 1, right, cnt + 1); } }
voidRadixSort(vector<int>& arr){ vector<vector<int>> buckets(10, vector<int>()); size_t maxLen = 0; for (size_t i = 0; i < arr.size(); i++) { size_t len = 0; int tmp = arr[i]; buckets[tmp % 10].push_back(arr[i]); do { len++; } while (tmp /= 10); maxLen = max(maxLen, len); } int idx = 0; for (size_t i = 0; i < 10; i++) { for (auto& it : buckets[i]) arr[idx++] = it; buckets[i].clear(); }
for (size_t t = 1; t < maxLen; t++) { for (size_t i = 0; i < arr.size(); i++) { int tmp = arr[i]; for (size_t j = 0; j < t && tmp; j++) tmp /= 10; buckets[tmp % 10].push_back(arr[i]); } idx = 0; for (size_t i = 0; i < 10; i++) { for (auto& it : buckets[i]) arr[idx++] = it; buckets[i].clear(); } } }
Time Complexity
Worst:
where is max length of digits,
and is the number of radix.
ShellSort
Implement
1 2 3 4 5 6 7 8 9 10 11 12
voidShellSort(vector<int>& arr){ size_t hs[] = {7, 3, 1}; for (size_t t = 0; t < 3; t++) { size_t h = hs[t]; for (size_t i = h; i < arr.size(); i++) { int tmp = arr[i]; size_t j = i; for (; j >= h && arr[j - h] > tmp; j -= h) arr[j] = arr[j - h]; arr[j] = tmp; } } }