排序

 冒泡排序:穩定,時間複雜度O(n2),空間複雜度O(1)ui

//bubble
void bubblesort(int *a, int n)
{
    int hig=n-1;
    int i;

    while(hig)
    {
        for(i=0;i<=hig-1;i++)
        {
            if(a[i]>a[i+1]) swap(&a[i],&a[i+1]);
        }
        hig--;
    }
}

雞尾酒排序:穩定,時間複雜度O(n2),空間複雜度O(1)。冒泡排序的變形。spa

//cocktail
void cocktailsort(int *a ,int n)
{
    int low=0,hig=n-1;
    int i;

    while(low<hig)
    {

        for(i=low;i<=hig-1;i++)
        {
            if(a[i]>a[i+1]) swap(&a[i],&a[i+1]);
        }

        hig--;

        for(i=hig;i>=low+1;i--)
        {
            if(a[i]<a[i-1]) swap(&a[i],&a[i-1]);
        }

        low++;
    }

}

插入排序:穩定,時間複雜度O(n2),空間複雜度O(1)指針

//insert
void insertsort(int *a, int n)
{
    int i,j;

    for(i=1;i<n;i++)
    {
        j=i;
        while(j>=1&&a[j]<a[j-1])
        {
            swap(&a[j],&a[j-1]);
            j--;
        }
    }
}

快速排序:不穩定,時間複雜度平均O(nlogn),最壞O(n2),空間複雜度O(logn)。code

三種實現:前兩種兩個指針一前一後,後一種指針都在前。第二種不使用交換。blog

//qsort  
void quicksort1(int *a, int low, int hig)
{
    int key=a[low];

    int i=low, j=hig;

    while(i<j)
    {
        while(i<j)
        {
            if(a[j]<key)
            {
                swap(&a[i],&a[j]);
                i++;
                break;
            }
            else j--;
        }

        while(i<j)
        {
            if(a[i]>key)
            {
                swap(&a[i],&a[j]);
                j--;
                break;
            }

            else i++;
        }
    }

    if(i-1>=low) quicksort1(a,low,i-1);
    if(i+1<=hig) quicksort1(a,i+1,hig);
}

void quicksort2(int *a, int low, int hig)
{
    int key=a[low];

    int i=low, j=hig;

    while(i<j)
    {
        while(i<j&&a[j]>=key) j--;

        if(i<j) a[i++]=a[j];

        while(i<j&&a[i]<=key) i++;

        if(i<j) a[j--]=a[i];
    }

    a[i]=key;

    if(i-1>=low) quicksort2(a,low,i-1);
    if(i+1<=hig) quicksort2(a,i+1,hig);
}

void quicksort3(int *a, int low, int hig)
{
    int key=a[hig];

    int i=low-1, j=low;

    while(j<hig)
    {
        if(a[j]<a[hig])
        {
            i++;
            swap(&a[i],&a[j]);
            j++;
        }
        else j++;
    }

    swap(&a[++i],&a[hig]);

    if(i-1>=low) quicksort3(a,low,i-1);
    if(i+1<=hig) quicksort3(a,i+1,hig);
}

 歸併排序:穩定,時間複雜度平均O(nlogn),此處額外使用O(n)空間,也能夠O(1)空間實現原地歸併排序. 歸併排序能夠解決逆序數對的統計問題.排序

//merge
void mergedata(int *a, int low, int mid, int hig, int *temp)
{
    if(low>=hig) return;

    int i,j,k;

    for(i=low,j=mid+1,k=low;i<=mid&&j<=hig;k++)
    {
        if(a[i]<a[j]) temp[k]=a[i++];
        else temp[k]=a[j++];
    }

    while(i<=mid) temp[k++]=a[i++];

    while(j<=hig) temp[k++]=a[j++];

    for(i=low;i<=hig;i++) a[i]=temp[i];
}

void _mergesort(int *a, int low, int hig, int *temp)
{
    if(low>=hig) return;

    int mid;

    mid=low+((hig-low)>>1);

    _mergesort(a,low,mid,temp);
    _mergesort(a,mid+1,hig,temp);
    mergedata(a,low,mid,hig,temp);
}

void mergesort(int *a, int n)
{
    if(a==NULL||n<0) return;

    int *temp=(int *)malloc(n*sizeof(int));

    _mergesort(a,0,n-1,temp);

    int i;
    for(i=0;i<n;i++) a[i]=temp[i];

    free(temp);
}
相關文章
相關標籤/搜索