快速排序算法

时间:2022-01-22 09:48:36

首先代码转载自http://www.slyar.com/blog/c-quicksort.html

void qsort(int s[], int l, int r)//l为基准值,一般取数组第一个值,r为数组长度
{
    int i, j, x;
    if (l < r)
    {
        i = l;
        j = r;
        x = s[i];
        while (i < j)
        {
            while(i < j && s[j] > x) j--; /* 从右向左找第一个小于x的数 */
            if(i < j) s[i++] = s[j];
            while(i < j && s[i] < x) i++; /* 从左向右找第一个大于x的数 */
            if(i < j) s[j--] = s[i];
        }
        s[i] = x;
        qsort(s, l, i-1); /* 递归调用 */
        qsort(s, i+1, r);
    }
}

一开始这个快速排序算法没看懂,和百度百科的算法有点不一样。

百度百科的算法具体步骤为:

假设有一组数组:A[0]…A[N-1]

1、设置两个变量i,j;

2、以第一组数据作为基准赋值给key;

3、从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于key的值A[J],并与key交换;

4、从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于key的A[I],与key交换;

5、重复第3、4、5步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后另循环结束。

百科这个算法中每次都要交换两个的值,但基准值还是在一趟算法最后的时候用到的。(即基准值总是最后放在最比基准值小的值和最比基准值大的值的中间)。

 

转载的这个代码干脆就不每次交换基准值,只是把小值和前面的大值互换位置,最后留下的位置即是基准值的位置,代码简洁、干脆。