数据结构--排序
专题--排序
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 }