1.冒泡排序
void Bubble(vector<int>& arr) { for(int i=0;i<arr.size()-1;i++){ 0 len-1 for(int j=0;j<arr.size()-i-1;j++){ 0 len-1-i if(arr[j]>arr[j+1]) swap(arr[j],arr[j+1]); j>j+1 } } }
0 len-1
0 len-1-i
j>j+1
2.选择排序
void selectionSort(vector<int>& arr) { for(int i=0;i<arr.size()-1;i++){ 0 len-1 int min_index=i; for(int j=i+1;j<arr.size();j++){ i+1 len if(arr[j]<arr[min_index]) min_index=j; } swap(arr[i],arr[min_index]); } }
3.插入排序
void insertionSort(vector<int>& arr) { for(int i=0;i<arr.size();i++){ int next_index=i+1; 上一堆以及排好了又来一个 while((next_index<arr.size())&&(arr[next_index-1]>arr[next_index])) { swap(arr[next_index-1],arr[next_index]); next_index--; } } }
4.快速排序
#include<iostream> #include<vector> using namespace std; int res[2]; void partition(vector<int>& arr,int left,int right) //分组问题荷兰国旗 { int p1=left-1,p2=right+1,index=left,target=arr[right]; while(index<p2) //不碰右边界 { if(arr[index]<target) swap(arr[index++],arr[++p1]); else if(arr[index]>target) swap(arr[index],arr[--p2]); //向右交换还得判断要不要向左 else index++; } res[0]=p1+1; res[1]=p2-1; } void process(vector<int>& arr,int left,int right) { if(left<right){ swap(arr[right],arr[(rand()%(right-left))+1+left]); //(left,right] partition(arr,left,right); process(arr,left,res[0]-1); process(arr,res[1]+1,right); } } int main() { int a; cin>>a; vector<int> arr(a); int up_down=0; for(int &b:arr) cin>>b; cin>>up_down; int p1=0,p2=arr.size()-1; //>=区最右端最初是-1 //process(arr,p1, p2); insertionSort(arr); if(!up_down){ for(int i=0;i<a;i++) cout<<arr[i]<<" "; } else{ for(int i=0;i<a;i++) cout<<arr[a-1-i]<<" "; } return 0; }
5.堆排序
void heapify(vector<int>& arr,int index,int heapsize) { int left=index*2+1; while(left<heapsize) { int largest=left+1<heapsize&&arr[left+1]>arr[left]?left+1:left; if(arr[largest]<=arr[index]) break; swap(arr[largest],arr[index]); index=largest; left=index*2+1; } } int main() { int a; cin>>a; vector<int> arr(a); int up_down=0; for(int &b:arr) cin>>b; cin>>up_down; int heapsize = arr.size(); for(int i=heapsize-1;i>=0;i--) heapify(arr,i,heapsize); //从右到左len-1到0,只改变下标index while(heapsize>0) { swap(arr[0],arr[--heapsize]); heapify(arr,0,heapsize); } //判断条件heapsize>0 变化--heapsize if(!up_down){ for(int i=0;i<a;i++) cout<<arr[i]<<" "; } else{ for(int i=0;i<a;i++) cout<<arr[a-1-i]<<" "; } return 0; }