快速排序的一种实现方法

来源:互联网 发布:云联惠平台下载软件 编辑:程序博客网 时间:2024/05/21 00:53
#include "stdio.h"
#define MIN 3
void swap(int *p, int *q)
{
    int temp = *p;
    *p = *q;
    *q = temp;
}
/*求中值*/
int median(int a[], int left, int right)
{
    int i;
    int midle = (left + right)/2;
    if(a[left] > a[midle])
    {
        swap(&a[left],&a[midle]);
    }
    if(a[left] > a[right])
    {
        swap(&a[left],&a[right]);
    }
    if(a[midle] > a[right])
    {
        swap(&a[midle],&a[right]);
    }
    swap(&a[midle],&a[right - 1]);//将中值交换到数组倒数第二个位置(因为第一个、中间那个、最后一个已经是排过序的)

    return a[right -1];
}


//insert sort algorithm
void insert_sort(int a[], int N)
{
    int P = 0, i = 0, temp = 0,j =0;
    for(P = 1; P < N; P++)
    {
        temp = a[P];
         for(j = P; j > 0; j--)//j can  not equal 0 to prevent from j-1 <0
        {
            if(a[j-1] > temp)
            {
                 swap(&a[j-1],&a[j]);
            }
        }
    }
}
void q_sort(int a[], int left, int right)
{
    int i,j,mid,idx;

    if(right - left +1 >= MIN)
    {
        mid = median(a,left,right);
        i = left;
        j = right - 1;
        for(;;)
        {
            while(a[++i] < mid){}
            while(a[--j] > mid){}
            if(i < j)
            {
                swap(&a[i],&a[j]);
            }
            else
           {
               break;
           }
        }
        swap(&a[i],&a[right -1]);
        q_sort(a,left,i-1);
        q_sort(a,i+1,right);
    }
    else
    {
        //插入排序
        insert_sort(a+left,right - left +1);
    }
}
void main ()
{
    int i = 0;
    int a[] = {8,1,4,9,2,3,0,5,6,7};
    q_sort(a,0,9);
    for(i = 0; i < 10; i++)
    {
        printf("the arr is :%d\n\r",*(a+i));
    }
}
0 0
原创粉丝点击