voidheapify(int arr[], int n, int i){ if (i >= n) { return; } int c1 = 2 * i + 1; int c2 = 2 * i + 2; int max = i; if (c1 < n && arr[c1] > arr[max]) { max = c1; } if (c2 < n && arr[c2] > arr[max]) { max = c2; } if (max != i) { swap(arr[i], arr[max]); heapify(arr, n, max); } }
voidbuildHeap(int arr[], int n){ int lastNode = n - 1; int parent = (lastNode - 1) / 2; for (int i = parent; i >= 0; --i) { heapify(arr, n, i); } }
voidheapSort(int arr[], int n){ buildHeap(arr, n); for (int i = n - 1; i >= 0; --i) { swap(arr[0], arr[i]); heapify(arr, i, 0); } }
intmain(){ int arr[] = {6, 1, 5, 2, 4, 3}; int len = sizeof(arr) / sizeof(arr[0]); heapSort(arr, len); for (int i = 0; i < len; ++i) { cout << arr[i] << " "; } return0; }
voidcountSort(int arr[], int n){ int max = arr[0]; int min = arr[0]; for (int i = 1; i < n; ++i) { if (arr[i] > max) { max = arr[i]; } if (arr[i] < min) { min = arr[i]; } } int range = max - min + 1; int *countArr = newint[range]; memset(countArr, 0, range * sizeof(int)); for (int i = 0; i < n; ++i) { countArr[arr[i] - min]++; } for (int i = 1; i < range; ++i) { countArr[i] += countArr[i - 1]; } int *sortedArr = newint[n]; for (int i = n - 1; i >= 0; --i) { sortedArr[countArr[arr[i] - min] - 1] = arr[i]; countArr[arr[i] - min]--; } for (int i = 0; i < n; ++i) { arr[i] = sortedArr[i]; } delete[] countArr; delete[] sortedArr; }
intmain(){ int arr[] = {6, 1, 5, 2, 4, 3}; int len = sizeof(arr) / sizeof(arr[0]); countSort(arr, len); for (int i = 0; i < len; ++i) { cout << arr[i] << " "; } return0; }
voidbucketSort(int arr[], int n){ int max = arr[0]; int min = arr[0]; for (int i = 1; i < n; ++i) { if (arr[i] > max) { max = arr[i]; } if (arr[i] < min) { min = arr[i]; } } int bucketNum = (max - min) / n + 1; vector<vector<int>> buckets(bucketNum); for (int i = 0; i < n; ++i) { int index = (arr[i] - min) / n; buckets[index].push_back(arr[i]); } for (int i = 0; i < bucketNum; ++i) { sort(buckets[i].begin(), buckets[i].end()); } int index = 0; for (int i = 0; i < bucketNum; ++i) { for (int j = 0; j < buckets[i].size(); ++j) { arr[index++] = buckets[i][j]; } } }
intmain(){ int arr[] = {6, 1, 5, 2, 4, 3}; int len = sizeof(arr) / sizeof(arr[0]); bucketSort(arr, len); for (int i = 0; i < len; ++i) { cout << arr[i] << " "; } return0; }
voidradixSort(int arr[], int n){ int max = arr[0]; for (int i = 1; i < n; ++i) { if (arr[i] > max) { max = arr[i]; } } int maxDigit = 0; while (max != 0) { max /= 10; maxDigit++; } int mod = 10; int dev = 1; vector<vector<int>> counter(10); for (int i = 0; i < maxDigit; ++i, mod *= 10, dev *= 10) { for (int j = 0; j < n; ++j) { int bucket = arr[j] % mod / dev; counter[bucket].push_back(arr[j]); } int index = 0; for (int j = 0; j < 10; ++j) { for (int k = 0; k < counter[j].size(); ++k) { arr[index++] = counter[j][k]; } counter[j].clear(); } } }
intmain(){ int arr[] = {6, 1, 5, 2, 4, 3}; int len = sizeof(arr) / sizeof(arr[0]); radixSort(arr, len); for (int i = 0; i < len; ++i) { cout << arr[i] << " "; } return0; }