数据结构--排序

专题--排序

1. 冒泡排序(O(n2))

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 //降序排
 5 void swap(int &a,int &b)
 6 {
 7     int temp=a;
 8     a=b;
 9     b=temp;
10 }
11 
12 //冒泡排序
13 //版本A
14 void BubbleSort(vector<int> &mvec)
15 {
16     int len=mvec.size();
17     for(int i=0;i<len-1;++i)
18     {
19         for(int j=i+1;j<len;++j)
20         {
21             if(mvec[i]<mvec[j])
22                 swap(mvec[i],mvec[j]);
23         }
24     }
25 }
26 //版本B:注意j从后向前循环
27 void BubbleSort1(vector<int> &mvec)
28 {
29     int len=mvec.size();
30     for(int i=0;i<len;++i)
31     {
32         for(int j=len-1;j>i;--j)  //从后向前
33         {
34             if(mvec[j-1]<mvec[j])
35                 swap(mvec[j-1],mvec[j]);
36         }
37     }
38 }
39 //版本C:避免不必要的循环
40 void BubbleSort2(vector<int> &mvec)
41 {
42     bool flag=true;  //
43     int len=mvec.size();
44     for(int i=0;i<len&&flag;++i)
45     {
46         flag=false;
47         for(int j=len-1;j>i;--j) //从后向前
48         {
49             if(mvec[j-1]<mvec[j])
50             {
51                 flag=true;
52                 swap(mvec[j-1],mvec[j]);
53             }
54         }
55     }
56 }
57 
58 int main()
59 {
60     vector<int> mvec{0,5,4,7,3,6,2,1,8,9};
61     BubbleSort2(mvec);
62     for(auto &mem:mvec)
63         cout<<mem<<" ";
64     cout<<endl;
65     return 0;
66 }

2. 简单选择排序(O(n2))

 1 //简单选择排序
 2 void SelectSort(vector<int> &mvec)
 3 {
 4     int len=mvec.size();
 5     for(int i=0;i<len-1;++i)
 6     {
 7         int maxI=i;       //用于记录
 8         for(int j=i+1;j<len;++j)
 9         {
10             if(mvec[maxI]<mvec[j])
11                 maxI=j;  //暂时不交换
12         }
13         if(maxI!=i)
14             swap(mvec[maxI],mvec[i]);
15     }
16 }
17 
18 
19 int main()
20 {
21     vector<int> mvec{0,5,4,7,3,6,2,1,8,9};
22     //BubbleSort2(mvec);
23     SelectSort(mvec);
24     for(auto &mem:mvec)
25         cout<<mem<<" ";
26     cout<<endl;
27     return 0;
28 }

3. 直接插入排序(O(n2))

  注意:不需要调用swap(),适用于“记录少,基本有序的情况”。

 1 //直接插入排序
 2 void InsertSort(vector<int> &mvec)
 3 {
 4     int len=mvec.size();
 5     for(int i=1;i<len;++i)     //从i=1开始:假设mvec[0]有序
 6     {
 7         if(mvec[i-1]<mvec[i])
 8         {
 9             int temp=mvec[i];  //记录mvec[i],找到正确位置插入
10             int j;
11             for(j=i-1;mvec[j]<temp;--j)  //从后向前
12                 mvec[j+1]=mvec[j];  //将有序子表后移
13             mvec[j+1]=temp;    //插入到正确位置
14         }
15     }
16 }
17 
18 int main()
19 {
20     vector<int> mvec{0,5,4,7,3,6,2,1,8,9};
21     //BubbleSort2(mvec);
22     //SelectSort(mvec);
23     InsertSort(mvec);
24     for(auto &mem:mvec)
25         cout<<mem<<" ";
26     cout<<endl;
27     return 0;
28 }

 4. 堆排序和快速排序

 1 //堆排序:注意:不计mvec[0]
 2 //已知记录mvec中中的关键字除mvec[s]之外均满足堆的定义
 3 void HeapAdjust(vector<int> &mvec,int s,int m)
 4 {
 5     int temp=mvec[s];
 6     for(int j=2*s;j<=m;j*=2)
 7     {
 8         if(j<m && mvec[j]<mvec[j+1])  //右孩子大
 9             ++j;     //j为关键字中较大的记录的下标
10         if(temp>=mvec[j])
11             break;
12         mvec[s]=mvec[j];
13         s=j;
14     }
15     mvec[s]=temp;   //插入
16 }
17 void HeapSort(vector<int> &mvec)
18 {
19     int len=mvec.size()-1;
20     for(int i=len/2;i>0;--i)
21     {
22         HeapAdjust(mvec,i,len);
23     }
24     for(int i=len;i>1;--i)
25     {
26         swap(mvec[1],mvec[i]);
27         HeapAdjust(mvec,1,i-1);
28     }
29 }
30 //快速排序
31 int Partition(vector<int> &mvec,int lo,int hi)
32 {
33     int pikey=mvec[lo];
34     while(lo<hi)
35     {
36         while(lo<hi && mvec[hi]<=pikey)
37             --hi;
38         swap(mvec[lo],mvec[hi]);
39         while(lo<hi && mvec[lo]>=pikey)
40             ++lo;
41         swap(mvec[lo],mvec[hi]);
42     }
43     return lo;  //最终lo和hi值相等;mvec[lo]==mvec[hi]==pikey
44 }
45 void QSort(vector<int> &mvec,int lo,int hi)
46 {
47     if(lo<hi)
48     {
49         int pi=Partition(mvec,lo,hi); //已将mvec[pi]放到合适位置
50 
51         QSort(mvec,lo,pi-1);
52         QSort(mvec,pi+1,hi);
53     }
54 }
55 //快排主函数
56 void QuikSort(vector<int> &mvec)
57 {
58     int len=mvec.size()-1;  //注意 hi=mvec.size()-1
59     QSort(mvec,0,len);
60 }
61 
62 
63 int main()
64 {
65     vector<int> mvec{9,5,4,7,3,6,2,1,0,8};
66     //BubbleSort2(mvec);
67     //SelectSort(mvec);
68     //InsertSort(mvec);
69     //HeapSort(mvec);
70     QuikSort(mvec);
71     for(auto &mem:mvec)
72         cout<<mem<<" ";
73     cout<<endl;
74     return 0;
75 }

 

posted @ 2017-07-13 10:53  halo_vagabond  阅读(173)  评论(0编辑  收藏  举报