排序
来源:互联网 发布:程序员媛 编辑:程序博客网 时间:2024/06/18 10:01
1,冒泡排序:重复扫,然后将顺序相反的换回来。 时间复杂度为n^2,空间复杂度为n。
int temp=right;for(int i=left;i<right;i++) for(int j=left;j<temp;j++) if(a[j]>a[j+1]) swap(a[j],a[j+1]);
2.快速排序:将其中一个元素作为基准,将无序子集分为两个区间,左半区的元素不大于基准,右半区的元素不小于基准。相当于每次确定一个元素的位置,然后二分求解。
void quicksort(int l,int r){ if(l<r){ int i=l,j=r; int temp=a[l]; while(i<j){ while(a[j]>=temp&&j>i) j--; if(j>i) a[i]=a[j]; while(a[i]<=temp&&i<j) i++; if(i<j) a[i]=a[j]; } a[i]=temp; quicksort(l-1,i); quicksort(i+1,r); }}
3.归并排序:分治法,将大区间分为有序小区间,然后将有序小区间按分离倒序合并为有序大区间。
void hb(int left,int mid,int right){ int i=left,j=mid+1,h=left; while(i<=mid&&j<=right) { if(a[i]<=a[j]) b[h++]=a[i++]; else if(a[j]<a[i]) b[h++]=a[j++]; } if(i<=mid) for(int k=i;k<=mid;k++) b[h++]=a[k]; else for(int k=j;k<=right;k++) b[h++]=a[k]; for(int g=left;g<=right;g++) a[g]=b[g];}void hbsort(int left,int right){ if(left<right) { int mid=(left+right)/2; hbsort(left,mid); hbsort(mid+1,right); hb(left,mid,right); }}
4.基数排序:(非负数排序)将数从低位到高位排。先按照个位数排序,然后按照十位数排然后。。。
void jssort(int n)//非负数排序{ int flag=1,base=1; queue <int> q[10]; while(flag) { for(int i=0;i<n;i++) { int g=a[i]/base%10; q[g].push(a[i]); } flag=0; int h=0; base*=10; for(int i=0;i<10;i++) { while(!q[i].empty()) { a[h++]=q[i].front(); q[i].pop(); if(flag==0&&a[h-1]/base!=0) flag=1; } } }}
0 0