中国大学MOOC-数据结构基础习题集、07-1、排序

题目链接:http://www.patest.cn/contests/mooc-ds/07-1

题目分析:本题旨在测试各种不同的排序算法在各种数据情况下的表现。因此没有标准答案。本帖旨在给出各种排序算法的C++实现形式,并将结果进行比较、总结。希望能给大家带来帮助

各种排序算法的代码:

1. 冒泡排序:

 1 void Bubble_Sort(ElementType A[], int N)
 2 {
 3     for(int P=N-1; P>=0; P--)
 4     {
 5         int flag = 0;
 6         for(int i=0; i<P; i++)/*一趟冒泡排序*/
 7         {
 8             if(A[i] > A[i+1])
 9             {
10                 ElementType temp = A[i+1];
11                 A[i+1] = A[i];
12                 A[i] = temp;
13                 flag = 1;
14             }
15         }
16         if(flag == 0) break;
17     }
18 }

2. 插入排序:

 1 void Insertion_Sort(ElementType A[], int N)
 2 {
 3     for (int P=1; P<N; P++)
 4     {
 5         ElementType Tmp = A[P];     /* 摸一张牌 */
 6         int i;
 7         for(i=P; i>0 && A[i-1]>Tmp; i--)
 8             A[i] = A[i-1];     /* 移出空位 */
 9         A[i] = Tmp;     /* 新牌落位 */
10     }
11 }

3. 希尔排序

 1 void Shell_Sort(ElementType A[], int N)
 2 {
 3     for(int D=N/2; D>0; D/=2)     /* 希尔增量序列 */
 4     {
 5         for(int P=D; P<N; P++)
 6         {
 7             ElementType Tmp = A[P];
 8             int i;
 9             for(i=P; i>=D && A[i-D]>Tmp; i-=D)
10                 A[i] = A[i-D];
11             A[i] = Tmp;
12         }
13     }
14 }

4. 选择排序

 1 void Selection_Sort(ElementType A[], int N)
 2 {
 3     for(int i=0; i<N; i++)
 4     {
 5         int MinPosition = i;
 6         int minNum = A[i];
 7         for(int j=i; j<N; j++)
 8         {
 9             if(A[j] < minNum)
10             {
11                 minNum = A[j];
12                 MinPosition = j;
13             }
14         }
15         ElementType tmp = A[i];
16         A[i] = A[MinPosition];
17         A[MinPosition] = tmp;
18     }
19 }

5. 头文件声明及main函数

 1 #include <iostream>
 2 #include <algorithm>
 3 
 4 #define ElementType int
 5 #define MAXNUM 100000000
 6 
 7 using namespace std;
 8 
 9 int cmp(const void *a, const void *b)
10 {
11     return *(int *)a - *(int *)b;
12 }
13 // 在这里插入上述几个函数
14 int main()
15 {
16     ElementType n;
17     cin >> n;
18     ElementType *a = new ElementType[n];
19     for(int i=0; i<n; i++)
20         cin >> a[i];
21     // Bubble_Sort(a, n);
22     // Insertion_Sort(a, n);
23     // Shell_Sort(a, n);
24     // Selection_Sort(a, n);
25     // sort(a, a+n);
26     // stable_sort(a, a+n);
27     qsort(a, n, sizeof(int),cmp);
28     for(int i=0; i<n; i++)
29     {
30         if(i != n-1)
31             cout << a[i] << " ";
32         else
33             cout << a[i];
34     }
35     return 0;
36 }

 

各种排序算法的总结:

  时间复杂度是的单位是ms,空间复杂度的单位是Kb,如果表格内有错误的话,请留言指正!

  当然以下的排序函数只是一少部分,堆排序和归并排序代码量比较大,博主有空的时候再更新。通过表格可以看出,O(NlogN)真的快了不少! 

排序算法 时间复杂度 稳定性 case0:只有1个 case1:11 case2:10^3 case3:10^4 case4:10^5 case5:10^5顺序 case6:10^5逆序 case7:10^5基本有序 case8:10^5随机正整数
冒泡排序 O(N^2) 稳定 1 1 3 155 超时 39 超时 278 超时
插入排序 O(N^2) 稳定 1 1 2 21 1655 39 3266 53 1652
希尔排序
O(NlgN)
不稳定 1 1 1 6 50 41 42 41 42
选择排序 O(N^2) 稳定 1 1 2 38 3279 3265 3266 3267 3267
sort函数 O(NlgN) 不稳定 1 1 2 5 44 40 47 44 36
stable_sort函数 O(NlgN) 稳定 1 1 1 5 45 41 41 40 38
qsort函数 O(NlgN) 不稳定 1 1 2 6 49 42 43 43 41

  

排序算法 空间复杂度 稳定性 case0:只有1个 case1:11 case2:10^3 case3:10^4 case4:10^5 case5:10^5顺序 case6:10^5逆序 case7:10^5基本有序 case8:10^5随机正整数
冒泡排序 O() 稳定 360 256 360 456 超时 1156 超时 1140 超时
插入排序 O() 稳定 236 284 232 260 1152 1260 1140 1184 1024
希尔排序 O() 不稳定 232 232 232 360 1128 1256 1128 1128 1000
选择排序 O() 稳定 284 232 232 376 1128 1144 1150 1180 1004
sort函数 O() 不稳定 232 236 364 376 1156 1152 1140 1180 1004
stable_sort函数 O() 稳定 232 232 232 360 1188 1188 1188 1188 1060
qsort函数 O() 不稳定 364 236 364 284 1144 1232 1144 1156 1136

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。