#include<iostream> using namespace std; const int N=10; 原地排序就是指不申请多余的空间来进行的排序, 就是在原来的排序数据中比较和交换的排序。 例如快速排序,堆排序等都是原地排序,合并排序,计数排序等不是原地排序 void exchange(int &a,int &b) { if(a!=b) { a=a+b; b=a-b; a=a-b; } } void Bubblesort(int *a,int len) ///稳定排序,原地排序 O(n^2) { bool flag=true; for(int i=0;i<len-1;i++) { flag=false; for(int j=0;j<len-1-i;j++) { if(a[j]>a[j+1]) { exchange(a[j],a[j+1]); flag=true; } } if(!flag) return; } } void insertsort(int *a,int len) ///稳定排序,原地排序 O(n^2) { int temp; for(int i=1;i<len;i++) { temp=a[i]; ///不要标记数组下标,该下标的值可能变化 for(int j=i-1;j>=0 && a[j]>temp;j--) a[j+1]=a[j]; a[++j]=temp; } } void selectsort(int *a,int len) ///不稳定排序,原地排序 O(n^2) { int temp; for(int i=0;i<len;i++) { temp=i; for(int j=i+1;j<len;j++) if(a[j]<a[temp]) temp=j; if(temp!=i) exchange(a[i],a[temp]); } } void QuickSort(int *a,int begin,int end) ///n*log(n),不稳定排序,原地排序 { if(begin<end-1) { int ref=a[end-1]; int i=begin-1; for(int j=begin;j<end-1;j++) { if(a[j]<ref) { i++; if(i!=j) exchange(a[i],a[j]); } } exchange(a[++i],a[end-1]); ///加1后的i即为临界点 QuickSort(a,begin,i); QuickSort(a,i+1,end); } } void Merge(int *a,int begin,int mid,int end)合并数组a中位置为[begin,mid) 和[mid,end). { int len1=mid-begin; int len2=end-mid; int *temp1=new int[len1]; memset(temp1,0,len1*sizeof(int)); int *temp2=new int[len2]; memset(temp2,0,len2*sizeof(int)); for(int i=0;i<len1;i++) temp1[i]=a[i+begin]; for(int j=0;j<len2;j++) temp2[j]=a[mid+j]; i=j=0; int k=begin; while(i<len1&&j<len2) { if(temp1[i]<=temp2[j]) { a[k++]=temp1[i]; i++; } else { a[k++]=temp2[j]; j++; } } while(i<len1) { a[k++]=temp1[i++]; } while(j<len2) { a[k++]=temp2[j++]; } delete []temp1; delete []temp2; } void MergeSort(int *a,int start,int end) ///n*log(n), 稳定排序,非原地排序 { if(start<end-1) { int i=(start+end)/2; MergeSort(a,start,i); MergeSort(a,i,end); Merge(a,start,i,end); } } int main() { int a[N]={200,3,5,7,9,8,4,1,6,10}; //int a[4]={8,4,3,9}; //Bubblesort(a,10); //insertsort(a,10); //selectsort(a,10); //QuickSort(a,0,10); //int a[3]={9,1,3}; //MergeSort(a,0,3); MergeSort(a,0,N); for(int i=0;i<N;i++) cout<<a[i]<<" "; cout<<endl; return 0; }