选择类排序
一、简单选择排序(Simple Selection Sort)
1.时间复杂度:O(n2)
2.空间复杂度:O(1)
3.实现:
1 void SelectSort(int* a, int n) { 2 int i, j, min; 3 for (i = 1; i < n; i++) { 4 for (min = i, j = i + 1; j < n; j++) {//选择最小的记录 5 min = a[j] < a[min] ? j : min; 6 } 7 if (i != min) {//与第i个记录交换 8 a[0] = a[i]; 9 a[i] = a[min]; 10 a[min] = a[0]; 11 } 12 } 13 }
二、堆排序(Heap Sort)
1.时间复杂度:nlog2n
2.空间复杂度:O(1)
3.实现:
1 void HeapAdjust(int* a, int n, int s) {//使数组a[s..n]成为大顶堆 2 int i; 3 a[0] = a[s]; 4 for (i = 2 * s; i <= n; i *= 2) { 5 if (i < n && a[i] < a[i + 1]) { 6 i++;//i为较大记录的下标 7 } 8 if (a[0] > a[i]) { 9 break; 10 } 11 a[s] = a[i]; 12 s = i; 13 } 14 a[s] = a[0];//插入 15 } 16 17 void HeapSort(int* a, int n) { 18 int i; 19 for (i = n / 2; i > 0; i--) {//把数组a建成大顶堆 20 HeapAdjust(a, n, i); 21 } 22 for (i = n; i > 1; i--){//将顶堆记录和当前未经排序子序列中最后一个记录相互交换 23 a[0] = a[1]; 24 a[1] = a[i]; 25 a[i] = a[0]; 26 HeapAdjust(a, i - 1, 1);//将a[1..i - 1]重新调整为大顶堆 27 } 28 }
三、源代码
1 //在 Microsoft Visual Studio Community 2022 下测试通过 2 #define _CRT_SECURE_NO_WARNINGS 3 #include <stdio.h> 4 5 void SelectSort(int* a, int n) { 6 int i, j, min; 7 for (i = 1; i < n; i++) { 8 for (min = i, j = i + 1; j < n; j++) {//选择最小的记录 9 min = a[j] < a[min] ? j : min; 10 } 11 if (i != min) {//与第i个记录交换 12 a[0] = a[i]; 13 a[i] = a[min]; 14 a[min] = a[0]; 15 } 16 } 17 } 18 19 void HeapAdjust(int* a, int n, int s) {//使数组a[s..n]成为大顶堆 20 int i; 21 a[0] = a[s]; 22 for (i = 2 * s; i <= n; i *= 2) { 23 if (i < n && a[i] < a[i + 1]) { 24 i++;//i为较大记录的下标 25 } 26 if (a[0] > a[i]) { 27 break; 28 } 29 a[s] = a[i]; 30 s = i; 31 } 32 a[s] = a[0];//插入 33 } 34 35 void HeapSort(int* a, int n) { 36 int i; 37 for (i = n / 2; i > 0; i--) {//把数组a建成大顶堆 38 HeapAdjust(a, n, i); 39 } 40 for (i = n; i > 1; i--){//将顶堆记录和当前未经排序子序列中最后一个记录相互交换 41 a[0] = a[1]; 42 a[1] = a[i]; 43 a[i] = a[0]; 44 HeapAdjust(a, i - 1, 1);//将a[1..i - 1]重新调整为大顶堆 45 } 46 } 47 48 int main(void) { 49 int i, a[11] = { 0, 5, 8, 2, 1, 9, 3, 6, 4, 7, 0 };//a[0]哨兵位 50 //SelectSort(a, 11); 51 HeapSort(a, 10); 52 for (i = 1; i < 11; i++) { 53 printf("%d ", a[i]); 54 } 55 return 0; 56 }

浙公网安备 33010602011771号