常用排序算法汇总

 终于把常用的排序算法写完了,发下自己记录一下。

#include <stdio.h>

//------------------------------------------------------------
//交换函数
void swap(int *a,int *b)
{
    int temp;
    temp = *a;
    *a=*b;
    *b=temp;
}

//------------------------------------------------------------
//选择排序
//时间复杂度:O(n^2)
int sort_select(int *a,int len)
{
    int i,j;
    int flag=0;
    int temp=0;
    for(i=0;i<len;i++)
    {
            temp=a[i];
            flag = i;
        for(j=i;j<len;j++)
        {
            if(a[j]<temp)
            {
                flag=j;
                temp=a[j];
            }
        }
        a[flag]=a[i];
        a[i]=temp;
    }
}

//------------------------------------------------------------
//直接插入排序
//时间复杂度:O(n^2)
int sort_insert(int *a,int len)
{
    int i,j;
    int temp;
    for(i=1;i<len;i++)
    {
        temp=a[i];
        for(j=i-1;j>=0;j--)
        {
            if(temp<a[j])
            {
                a[j+1] = a[j];
            }
            else
            {
                break;
            }
        }
        a[j+1] = temp;
    }
    return 1;
}

//------------------------------------------------------------
//冒泡法排序
//时间复杂度:O(n^2)
int sort_bubbling(int *a,int len)
{
    int i,j;
    int temp;
    for(i=1;i<len-1;i++)
    {
        for(j=0;j<len-i;j++)
        {
            if(a[j]>a[j+1])
            {
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }
    return 1;
}

//------------------------------------------------------------
//双向冒泡排序
//时间复杂度:O(n^2)
int sort_bubbling2(int *a,int len)
{
    int j;
    int left=1;
    int right = len-1;
    int t;
    do{
        //反向冒泡 从后往前
        for(j=right;j>=left;j--)
        {
            if(a[j]<a[j-1])
            {
                swap(&a[j],&a[j-1]);
                    t =j;
            }
        }
        //顺序冒泡 从前往后
        left =t+1;
        for(j=left;j<right;j++)
        {
            if(a[j]<a[j-1])
            {
                swap(&a[j],&a[j-1]);
                t=j;
            }
        }
        right = t-1;

    }while(left<=right);

    return 1;
}

//------------------------------------------------------------
//归并排序
//时间复杂度:O(nlogn)
void  merge(int *a,int p,int q,int r)
{
    int i,j;
    int k;
    int n1 = q-p+1;
    int n2 = r-q;
    int left[n1];
    int right[n2];

    for(i=0,k=p;i<n1;i++,k++)
        left[i] = a[k];
    for(i=0,k=q+1;i<n2;i++,k++)
        right[i] = a[k];

    for(i=0,j=0,k=p;i<n1&&j<n2;k++)
    {
        if(left[i]<right[j])
        {
            a[k] = left[i];
            i++;
        }
        else
        {
            a[k] = right[j];
            j++;
        }
    }

    if(i<n1)
        for(;i<n1;i++,k++)
                a[k]=left[i];
    if(j<n2)
        for(;j<n2;j++,k++)
            a[k] = right[j];


}
int mergesort(int *a,int p,int r)
{
    int q;
    if(p<r)
    {
        q=(p+r)/2;
        mergesort(a,p,q);
        mergesort(a,q+1,r);
        merge(a,p,q,r);
    }
}

int sort_merge(int *a,int len)
{
    mergesort(a,0,len-1);
}


//------------------------------------------------------------
//快速排序
//时间复杂度:O(nlogn)
int quicksort(int *a,int l,int r)
{
    int index;
    int left =l;
    int right = r;
    if(l>=r)
        return;
    index = a[left];
    while(left<right)
    {
        while(left<right && a[right]>index)
            right--;
        if(left<right)
            a[left++] = a[right];

        while(left<right && a[left]<index)
            left++;
        if(left<right)
            a[right--] = a[left];
    }
    a[left] = index;

    quicksort(a,l,left-1);
    quicksort(a,left+1,r);
}
int sort_quick(int *a,int len)
{
    quicksort(a,0,len-1);
}

//------------------------------------------------------------
//希尔排序
//时间复杂度:O(nlogn)
int sort_shell(int *a,int len)
{
    int i,j;
    int h;
    int temp;

    for(h=len/2;h>0;h=h/2)
    {
        for(i=h;i<len;i++)
        {
            temp = a[i];
            for(j=i-h;j>=0;j-=h)
            {
                if(temp < a[j])
                {
                    a[j+h] = a[j];
                }
                else
                {
                    break;
                }
            }
            a[j+h] = temp;
        }
    }

}

//------------------------------------------------------------
//堆排序
//时间复杂度:O(nlogn)
int heapmax(int *a,int i,int len)
{
    int lchild=2*i;
    int rchild=2*i+1;
    int max=i;
    if(i<=len/2)
    {
        if(lchild<=len && a[lchild-1]>a[max-1])
        {
            max = lchild;
        }

        if(rchild<=len && a[rchild-1]>a[max-1])
        {
            max = rchild;
        }

        if(max != i)
        {
            swap(&a[i-1],&a[max-1]);
            heapmax(a,max,len);
        }
    }

}

int sort_heapmax(int *a,int len)
{
     //create heap
    int i;
    for(i=len/2;i>=1;i--)
    {
        heapmax(a,i,len);
    }

    //heap sort
    for(i=len;i>1;i--)
    {
        swap(&a[0],&a[i-1]);
        heapmax(a,1,i-1);
    }
}


//测试用例
int main(void)
{
    int a[] = {1,23,3,4,5,6,87,34,3,77,77,3,56,100};
    int a_select[] = {1,23,3,4,5,6,87,34,3,77,77,3,56,100};
    int a_insert[] = {1,23,3,4,5,6,87,34,3,77,77,3,56,100};
    int a_bubbling[] = {1,23,3,4,5,6,87,34,3,77,77,3,56,100};
    int a_bubbling2[] = {1,23,3,4,5,6,87,34,3,77,77,3,56,100};
    int a_merge[] = {1,23,3,4,5,6,87,34,3,77,77,3,56,100};
    int a_quick[] = {1,23,3,4,5,6,87,34,3,77,77,3,56,100};
    int a_shell[] = {1,23,3,4,5,6,87,34,3,77,77,3,56,100};
    int a_heap[] = {1,23,3,4,5,6,87,34,3,77,77,3,56,100};
    int i;
    int len = sizeof(a)/sizeof(a[0]);
    printf("the originala data: \n");
    for(i=0;i<len;i++)
        printf("%d,",a[i]);
        printf("\n");

    printf("insert:\n");
    sort_insert(a_insert,len);
    for(i=0;i<len;i++)
        printf("%d,",a_insert[i]);
        printf("\n");

    printf("select:\n");
    sort_select(a_select,len);
    for(i=0;i<len;i++)
        printf("%d,",a_select[i]);
        printf("\n");
    printf("bubbling:\n");
    sort_bubbling(a_bubbling,len);
    for(i=0;i<len;i++)
        printf("%d,",a_bubbling[i]);
        printf("\n");

    printf("bubbling2:\n");
    sort_bubbling2(a_bubbling2,len);
    for(i=0;i<len;i++)
        printf("%d,",a_bubbling2[i]);
        printf("\n");

    printf("merge:\n");
    sort_merge(a_merge,len);
    for(i=0;i<len;i++)
        printf("%d,",a_merge[i]);
        printf("\n");

    printf("quick:\n");
    sort_quick(a_quick,len);
    for(i=0;i<len;i++)
        printf("%d,",a_quick[i]);
        printf("\n");

    printf("shell:\n");
    sort_shell(a_shell,len);
    for(i=0;i<len;i++)
        printf("%d,",a_shell[i]);
        printf("\n");

    printf("heap:\n");
    sort_heapmax(a_heap,len);
    for(i=0;i<len;i++)
        printf("%d,",a_heap[i]);
        printf("\n");

}

猜你喜欢

转载自blog.csdn.net/zhenglie110/article/details/40918441