数据结构之排序

1.排序的分类

在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的;若具有相同关键字的记录之间的相对次序发生变化,则称这种排序方法是不稳定的。

稳定的排序 时间复杂度   空间复杂度
冒泡排序 最差和平均是O(n2),最好是O(n)    1 
双向冒泡排序 最差和平均是O(n2),最好是O(n)  1
插入排序 最差和平均是O(n2),最好是O(n)   1
归并排序  最差、平均、最好都是O(nlogn) O(n) 
桶排序  O(n) O(k) 
基数排序  O(dn)(d是常数) O(n) 
二叉树排序  O(nlogn) O(n) 
图书馆排序  O(nlogn)

(1+e)n 

 

 

不稳定的排序 时间复杂度 空间复杂度
选择排序 最差和平均是O(n2),最好是O(n) 1
希尔排序 O(nlogn)---O(n2),平均时间nO(sqrt(n)) 1
堆排序 最差、平均、最好都是O(nlogn) 1
快速排序 平均O(nlogn),最差是O(n2) O(nlogn)

 2.常见排序算法分析:

1.冒泡法

冒泡法就是第一个数开始,不断地和后面地数比较,大的数往后,一轮后最大的数跑到最后;为了使序列在正序列前提下,能减少排序的次数,需要用一个BOOL型变量来判断是否发生了交换

 1 #include<iostream>
 2 using namespace std;
 3 
 4 
 5 void sort(int a[],int n)
 6 {
 7     int i,j,temp;
 8     bool exchange;
 9     for(i=0;i<n-1;i++)
10     {
11         exchange = false;
12         for(j=0;j<n-i-1;j++)
13         {
14             if(a[j+1]<a[j])
15             {
16                 temp = a[j+1];
17                 a[j+1] = a[j];
18                 a[j] = temp;
19             }
20             exchange = true;
21         }
22         if(!exchange)
23             return;
24     }
25 }
26 
27 
28 
29 int main()
30 {
31     int a[] = {13,31,45,26,78,56,90,24,15,81};
32     sort(a,10);
33     for(int i=0;i<10;i++)
34         cout<<a[i]<<' ';
35     cout<<endl;
36     return 0;
37 }

2.直接插入法

注意用while来实现寻找插入的位置,便于理解

 1 #include<iostream>
 2 using namespace std;
 3 
 4 
 5 void sort(int a[],int n)
 6 {
 7     int i,j;
 8     for(i=1;i<=n-1;i++)
 9     {
10         j = i-1;
11         int temp = a[i];
12         while(temp<a[j])
13         {
14             a[j+1]=a[j];
15             j--;
16         }
17         a[++j]=temp;
18     }
19 }
20 
21 
22 
23 int main()
24 {
25     int a[] = {13,31,45,26,78,56,90,24,15,81};
26     sort(a,10);
27     for(int i=0;i<10;i++)
28         cout<<a[i]<<' ';
29     cout<<endl;
30     return 0;
31 }

 3.希尔排序

根据直接排序改造而来,距离为d的为一组,组内进行直接插入排序,d从n/2不断除2减小,最小减为1;

 1 #include<iostream>
 2 using namespace std;
 3 
 4 
 5 void sort(int a[],int n)
 6 {
 7     int i,j,d;
 8     for(d=n/2;d>=1;d/=2)
 9     {
10         for(i=d;i<=n-1;i++)
11         {
12             j = i-d;
13             int temp = a[i];
14             while(temp<a[j])
15             {
16                 a[j+d]=a[j];
17                 j-=d;
18             }
19             j+=d;
20             a[j]=temp;
21         }
22     }
23 }
24 
25 
26 
27 int main()
28 {
29     int a[] = {13,31,45,26,78,56,90,24,15,81};
30     sort(a,10);
31     for(int i=0;i<10;i++)
32         cout<<a[i]<<' ';
33     cout<<endl;
34     return 0;
35 }

 

posted @ 2014-05-13 20:52  若非浅醉  阅读(159)  评论(0)    收藏  举报