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;
}
}
}
}