voidShellSort(ELEMENT_TYPE a[], int n){ // 希尔2 int si, i, j, k; int Sedgewick[] = {929, 505, 20, 109, 41, 19, 5, 1, 0}; for (si = 0; Sedgrwick[si] >= N; si++) { for (i = Sedgrwick[si]; i > 0; i = Sedgrwick[++si]) { for (j = i; j < n; j++) { ELEMENT_TYPE temp = a[j]; for (k = j; k >= i && a[k - i] > temp; k -= i) a[k] = a[k - i]; a[k] = temp; } } } }
堆排序
那么简单排序中的选择排序是否可以优化呢?答案是肯定的
实现思路
首先选择排序的外层循环是不可变的,优化的只能是内层循环,即寻找数列之中最小的元素的过程
选择排序中,此过程运用了遍历数组的方式,复杂度为 \(O(N)\)
而在之前,我们学习了堆的知识,所以我们可以利用最小堆来进行寻找
代码1
1 2 3 4 5 6 7 8 9
voidHeapSort(ELEMENT_TYPE a[], int n){ // 堆 int i; ELEMENT_TYPE tmpA; BuildHeap(a); for (i = 0; i < n; ++i) tmpA = DeleteMin(a); for (i = 0; i < n; ++i) a[i] = tmpA[i]; }
voidHeapSort(ELEMENT_TYPE a[], int n){ // 堆 int i; for (i = N / 2; i >= 0; --i) PercDown(a, i, n); for (i = 0; i < n; --i) { Swap(&a[0], &a[i]); PercDown(a, i, n); } }
voidMerge(int a[], int l, int r, int rightEnd, int temp[]){ int leftEnd = r-1 ; int left = l, tmp = l;
while (l <= leftEnd && r <= rightEnd){ // 当左右子序列均不空 if (a[l] > a[r]) temp[tmp++] = a[r++]; else temp[tmp++] = a[l++]; } while (l <= leftEnd) temp[tmp++] = a[l++]; while (r <= rightEnd) temp[tmp++] = a[r++]; for (int i = left; i < rightEnd + 1; i++) a[i] = temp[i]; }
voidMergeSort(int a[], int l, int rightEnd, int temp[]){ int center; if (l < rightEnd) { center = (l + rightEnd) / 2; MergeSort(a, l, center, temp); MergeSort(a, center + 1, rightEnd, temp); Merge(a, l, center+1, rightEnd, temp); } }
voidMerge(int a[], int temp[], int l, int r, int rightEnd){ int leftEnd = r-1 ; int left = l, tmp = l;
while (l <= leftEnd && r <= rightEnd){ if (a[l] > a[r]) temp[tmp++] = a[r++]; else temp[tmp++] = a[l++]; } while (l <= leftEnd) temp[tmp++] = a[l++]; while (r <= rightEnd) temp[tmp++] = a[r++]; for (int i = left; i < rightEnd + 1; i++) a[i] = temp[i]; }
voidMergePass(ELEMENT_TYPE a[], ELEMENT_TYPE tmpA[], int n, int length){ int i, j; for (i = 0; i <= n - 2*length; i += 2*length) Merge(a, tmpA, i, i+length, n-1); if (i + length < n) Merge(a, tmpA, i, i+length, n-1); else for (j = i; j < n; j++) tmpA[j] = a[j]; }
voidMergeSort(ELEMENT_TYPE a[], int n){ int length; ELEMENT_TYPE* tmpA; length = 1; tmpA = malloc(n*sizeof(ELEMENT_TYPE)); if (tmpA != NULL) { while (length < n) { MergePass(a, tmpA, n, length); length *= 2; MergePass(a, tmpA, n, length); length *= 2; } free(tmpA); } else { printf("空间不足"); } }
ELEMENT_TYPE Media3(ELEMENT_TYPE a[], int left, int right){ int center = (left + right) / 2; if (a[left] > a[center]) Swap(&a[left], &a[center]); if (a[left] > a[right]) Swap(&a[left], &a[right]); if (a[center] > a[right]) Swap(&a[center], &a[right]);