排序算法默写
1.快速排序
#include <iostream> #include <string> #include <vector> using namespace std; /*交换单个元素*/ void swap(vector<int>&vec,int a,int b){ int temp; temp=vec[a]; vec[a]=vec[b]; vec[b]=temp; } int partition(vector<int>&vec,int lo,int hi){ swap(vec,lo,lo+rand()%(hi-lo));//随机交换首元素,区间本来是要(hi-lo+1),但是数组区间是从0开始的,本来就小1,不然会越界 int privot=vec[lo]; while(hi>lo){ while(hi>lo&&vec[hi]>=privot)//右边不小于轴点 hi--; if(hi>lo){ vec[lo]=vec[hi]; lo++; } while(hi>lo&&vec[lo]<=privot)//左边不大于轴点 lo++; if(hi>lo){ vec[hi]=vec[lo]; hi--; } } vec[lo]=privot;//当左右分堆完后(lo==hi),插入轴点值 return lo;//返回轴点位置 } void quicksort(vector<int>&vec,int lo,int hi){ if(hi==lo){ //递归基,hi与lo不成区间的时候返回 return; } int mi=partition(vec,lo,hi); if(hi>mi) quicksort(vec,lo,mi-1); //递归得排左边 if(mi>lo) quicksort(vec,mi+1,hi); //递归得排右边 } int main(){ int nums[10]={8,4,2,3,1,5,12,100,9,42}; vector<int> vec(nums,nums+10); int size=vec.size(); int hight=size-1; quicksort(vec,0,hight); for(int i=0;i<size;i++){ cout<<vec[i]<<" "; } cout<<endl; }
2.选择排序
#include <iostream> #include <string> #include <vector> using namespace std; void select_sort(vector<int>& vec){ int size=vec.size(); for(int i=0;i<size-1;i++){ //排到倒数第二个,所以要size-1 int mins=i; //而且这里也要注意,对比下标要从i开始 for(int j=i+1;j<size;j++){ //这里要注意内部循环要对比到最后一个,所以要j<size if(vec[j]<vec[mins]) mins=j; } swap(vec[i],vec[mins]); } } int main(){ int len=10; int nums[len]={8,4,2,3,1,5,12,100,9,42}; vector<int> vec(nums,nums+10); int hi=len-1; select_sort(vec); for(int i=0;i<len;i++){ cout<<vec[i]<<" "; } cout<<endl; }
3.插入排序
#include <iostream> #include <string> #include <vector> using namespace std; void select_sort(vector<int>&vec){ int size=vec.size(); for(int i=1;i<size;i++){ //从第二个数开始 int key=vec[i]; //先用额外空间保存要排的数 int j=i-1; //已排序的数的个数 while((j>=0)&&(key<vec[j])){ //注意这里要对比到第0个数,而且这里要直到找到比第J个数大 vec[j+1]=vec[j]; //不停的往后移动,刚好j+1=i,不怕被覆盖 j--; } vec[j+1]=key; //找到比j大的位置后相应插入,j+1的数已经往后移一位,已经预留好位置 } } int main(){ int len=10; int nums[len]={8,4,2,3,1,5,12,100,9,42}; vector<int> vec(nums,nums+10); int hi=len-1; select_sort(vec); for(int i=0;i<len;i++){ cout<<vec[i]<<" "; } cout<<endl; }
4.冒泡法
#include <iostream> #include <string> #include <vector> using namespace std; void maopao_sort(vector<int>& vec){ int size=vec.size(); for(int i=0;i<size-1;i++){ //因为是和后面一个对比,所以再迭代过程中迭代到倒数第二个,不然溢出 for(int j=0;j<size-i-1;j++){ //同样道理,对比到倒数第二个,而且要减去i,因为后面已经是排好的 if(vec[j]<vec[j+1]) swap(vec[j],vec[j+1]); } } } int main(){ int len=10; int nums[len]={8,4,2,3,1,5,12,100,9,42}; vector<int> vec(nums,nums+10); maopao_sort(vec); for(int i=0;i<len;i++){ cout<<vec[i]<<" "; } cout<<endl; }