排序

来源:互联网 发布:程序员媛 编辑:程序博客网 时间: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
原创粉丝点击