希尔排序&&快速排序&&归并排序

希尔排序:插入排序的改良版,先取一个增量d,d=n/2,再从数列的第一个元素开始,每隔d个取数,将这几个数排序,再将d/2,依旧从第一个数开始,相隔d取数排序,直到d取1,一定可以将原数列排列完整。相比于插入排序,希尔排序每轮进行排序的元素较小,每轮排序的数更接近有序数列,充分发挥插入排序在较小数列和较有序数列性能更好的的优点。

快速排序:使用一个基准,作为中间值,小于这个基准的元素放在左边,大于的放在右边。记有m个元素在左边,执行一次后,再将左边m个元素进行一次排序,右边进行一次排序,直到l=r。

int a[100];

int partition(int l,int r)
{
    int m=l;               //m是分组数列的第一个元素
    int t=a[r];             //将队尾标记为基准
    for(int i=l;i<r;i++)   
    {
        if(a[i]<t)          
        {
            swap(a[i],a[m]);    //将小于基准数的元素放在该组数列前
            m++;               //m可以向后移
        }
    }
    swap(a[m],a[r]);
    return m;                //m之前的元素都比基准数小
}

void quicksort(int l,int r)
{
    if(l<r)
    {
        int i=partition(l,r);
        quicksort(l,i-1);    //基准数在中间,一定是拍好序的
        quicksort(i+1,r);
    }
}

快速排序和希尔排序是不稳定的排序,若数列中两个元素的值一样,则可能改变两个元素的顺序。

归并排序:先将整个数列离散范围n个部分,再将这n个数两两合并的同时排序,以此分组继续归并,排序。

int a[10],b[10];

void merge(int l,int mid,int r)
{
    int i=l,j=mid+1,t=0;
    while(i<=mid&&j<=r)               //分为左右两个组,如果左边的组元素比右边的小,则将左边的元素进入b数组,反之则将右边的进入。
    {
        if(a[i]<a[j])
            b[t++]=a[j++];
        else
            b[t++]=a[i++];
    }
    while(i<=mid) b[t++]=a[i++];      //将左右还剩余的部分进入b数组
    while(j<=r) b[t++]=a[j++];
    for(i=0;i<t;i++) a[l+i]=b[i];     //将已经排列好的数放回原数列
}

void mergesort(int l,int r)
{
    if(l<r)                             //最先开始将l=0,r=n-1
    {
        int mid=(l+r)/2;                //按照先左后右的形式逐渐分组
        mergesort(l,mid);
        mergesort(mid+1,r);
        merge(l,mid,r);                 //将数列离散化后开始合并,离散的最小单位为2
    }
}

posted @ 2025-11-10 23:25  _窗帘  阅读(8)  评论(0)    收藏  举报