选择类排序

一、简单选择排序(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 }
源代码

 

posted @ 2022-02-11 22:33  吕辉  阅读(65)  评论(0)    收藏  举报