排序总结

1、冒泡排序:每次将最大或最小值通过交换放到数组前面。

void Bubble_Sort() //冒泡排序 
{
    int i,j,tmp,pos;
    for(i=0;i<n;i++)
        for(j=0;j<n-i-1;j++)
        if(a[j]>a[j+1]){
            tmp=a[j];
            a[j]=a[j+1];
            a[j+1]=tmp;
        }
}

2、插入排序:

由n-1趟排序组成,对于从P=1到P=n-1趟排序,每次排序保证从0到P之间的元素为已排序状态(即0~P-1是排好序的)。

void Insert_Sort() //插入排序 
{
    int i,j,tmp;
    for(i=1;i<n;i++){
        tmp=a[i];
        for(j=i;j>0&&a[j-1]>tmp;j--)
        a[j]=a[j-1];
        a[j]=tmp;
    }
}

3、希尔排序:

通过比较相距一定间隔的元素来工作,这些间距序列h1,h2,……,hn又称为增量序列,相当于对这些增量序。

相当于对独立的hi个独立的子数组进行插入排序。

void Shell_Sort() //希尔排序 
{
    int i,j,k,tmp;
    for(i=n/2;i>0;i/=2){
        for(j=i;j<n;j++){
            tmp=a[j];
            for(k=j;k>=i;k-=i)
            if(tmp<a[k-i]) a[k]=a[k-i];
            else break;
            a[k]=tmp;
        }
    }
} 

 4、堆排序

思路:

将n个元素建一个对根节点最大的最大堆,

然后每次DeleteMax,并将这个值放到数组末尾,最后形成一个从小到大排列的数组。

void Swap(int &x,int &y)
{
    int tmp=x;x=y;y=tmp;
}
void PercDown(int i,int len)
{
    int tmp=a[i],child;
    for(;i*2<len;i=child){
        child=i*2;
        if(child!=len-1&&a[child+1]>a[child]) child++;
        if(tmp<a[child]) a[i]=a[child];
        else break;
    }
    a[i]=tmp;
}
void Heap_Sort(int len)
{
    int i,j;
    for(i=len/2;i>=0;i--) PercDown(i,len);
    for(i=len-1;i>=0;i--){
        Swap(a[0],a[i]);
        PercDown(0,i);
    }
}

 

5、归并排序

基本操作:合并两个有序表,先将一个数组不断划分为不同阶段的数组,然后依次合并这些数组。

int b[1200];
void Merge(int left,int mid,int right)
{
    int i=left,j=mid+1,pos=left;
    while(i<=mid&&j<=right){
        if(a[i]<a[j]) b[pos++]=a[i++];
        else b[pos++]=a[j++];
    }
    while(i<=mid) b[pos++]=a[i++];
    while(j<=right) b[pos++]=a[j++];
    for(i=left;i<=right;i++) a[i]=b[i];
}
void Merge_Sort(int left,int right)
{
    if(left<right){
        int mid=(left+right)/2;
        Merge_Sort(left,mid);
        Merge_Sort(mid+1,right);
        Merge(left,mid,right);
    }
}

 

6、快速排序:

思路:先找到一个枢纽元,然后将大于枢纽元的元素放到右边,小于枢纽元的元素放到左边,

依次递归下去,直到所有元素都有序。

void Quick_Sort(int left,int right)
{
    if(left>=right) return ;
    int i=left,j=right-1,tmp=a[left];
    while(i!=j){
        while(i<j&&a[j]>=tmp) j--;
        if(i<j) a[i]=a[j];
        while(i<j&&a[i]<=tmp) i++;
        if(i<j) a[j]=a[i];
    }
    a[i]=tmp;
    Quick_Sort(left,i-1);
    Quick_Sort(i+1,right);
}

 

posted @ 2019-02-02 12:52  麟阁  阅读(76)  评论(0编辑  收藏  举报