您的位置:首页 > 理论基础 > 数据结构算法

快速排序

2014-04-17 10:14 197 查看
快速排序(类似于归并算法)是一种分而治之算法。首先它将列表分为两个更小的子列表:一个大一个小。然后递归排序这些子列表。下面就用分而治之的方法来排序子数组A[p...r];

步骤:

Divide:从列表中取一个元素作为支点,将数组分为A[p‥q
- 1] andA[q + 1‥r] ,A[p ‥ q -
1]中每一个元素都小于A[q] , 而A[q + 1 ‥ r]中每个元素都大于A[q].计算出支点实际存在数组中的位置,即q的值就是PARTITION操作。

Conquer:通过递归的方法对两个数组进行排序

Combine:因为子数组是原地处理的(即in-place),所以不需要合并他们,A[p....r]已经是排好序的。

平均时间复杂度是O(nlgn);

#include <stdio.h>

void quickSort(int *pstart, int *pend)

{

    if(pend > pstart)

    {

        int *phead = pstart;

        int *ptail = pend;

        int num = *pstart; // 作为基准数字

        while(ptail > phead)

        {

            if(*phead > *ptail)

            {

                int temp = *phead;

                *phead = *ptail;

                *ptail = temp;

            }

            if(*phead != num)

            {

                ++phead;

            }

            else

            {

                --ptail;

            }

        }

        quickSort(pstart, phead-1);

        quickSort(phead+1, pend);

    }

}

 

int main()

{

    int arr[] = {-3,-5,0,-2,5,1,6,-2,8,7,-9,20};

    int i = 0;

    quickSort(arr, arr+12);

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

    {

        printf("%d ",arr[i]);

    }

    printf("\n");

    return 0;

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息