快速排序

#include

/*快速排序算法-升序

最坏情况:O(n^2),最好情况: O(n.logn)

注意privot中枢纽元是放在right-1的位置

当数组比较小时,可选用插入排序

 */

void insertionSort(int a[],int n)

{

    int j,p;

    int temp;

    for(p=1;p<n;p++)

    {

        temp=a[p];

        for(j=p;j>0&&a[j-1]>temp;j–)

            a[j]=a[j-1];

        a[j]=temp;

    }

}

void swap(int *p1, int *p2)

{

    int temp;

    temp=*p1,*p1=*p2,*p2=temp;

}

int pivotSelection(int a[],int left,int right)

/*pivot也可以用其他方法选择,这里用中值法*/

{

    int center=(left+right)/2;

    if( a[left] > a[center] )

        swap( &a[left] ,&a[center]);

    if( a[left] > a[right])

        swap( &a[left], &a[right]);

    if( a[center] > a[right] )

        swap( &a[center], &a[right]);

    swap( &a[center],&a[right-1]);

    return a[right-1];

}

void qsort(int array[],int left,int right)

{

    int i,j;

    int pivot;

    if(right-left>=2)/*若选插入排序,数组序号差可增大*/

    {

             pivot=pivotSelection(array,left,right);

            i=left,j=right-1;

            for(;;)

            {   

                while( array[++i] < pivot)

                {}

                while( array[–j] > pivot)

                {}

                if(i<j)

                    swap(&array[i], &array[j]);

                else

                    break;

            }

    swap( &array[i], &array[right-1]);

    qsort( array,left,i-1);

    qsort( array, i+1,right);

    }

    /* else

    {

         insertionSort(array+left,right-left+1);

    }

    */

      

           

}

void main()

{

    int s[]={3,5,76,333,2,75,200};

    int i;

    for(i=0;i<7;i++)

        printf(“%d/n”,s[i]);

    qsort(s,0,6);

    printf(“——————/n”);

    for(i=0;i<7;i++)

        printf(“%d/n”,s[i]);

    getchar();

}

点赞