Loading...

[算法] 分治策略:快速排序

先引用维基上的一个图,它很形象地展示了快速排序的整个过程:
快速排序算法图解

快速排序的原理可参考上面的链接或任意一本算法教材,让我来讲也讲不清楚,我也是花好久才彻底看明白(基础太差了,汗),所以就贴贴代码好了,有人会说了,快排的代码网上多得很,还要你来贴干嘛。因为这些代码是我看着《算法基础》这本书上的原理和图自己琢磨出来的(完工后发现跟别人的代码惊人地雷同,汗汗汗),只有递归的终止条件那里参考了一下现成的代码,留下来当作笔记吧。

#include <stdio.h>

int pivot(int a[], int left_, int right_)
{
    int i, j, p, k, tmp;
    k = i = left_;
    j = right_ + 1;
    p = a[i];
    while (1)
    {
        while (a[++i] <= p && i <right_);
        while (a[--j]> p && j>= left_);
        if (i <j)
        {
            tmp = a[i];
            a[i] = a[j];
            a[j] = tmp;
        }
        else
            break;
    }
    tmp = a[k];
    a[k] = a[j];
    a[j] = tmp;
    return j;
}

void quick_sort(int a[], int left_, int right_)
{
    if (left_ <right_)
    {
        int p = pivot(a, left_, right_);
        quick_sort(a, left_, p - 1);
        quick_sort(a, p + 1, right_);
    }
}

int main(void)
{
    int a[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9};
    int len = sizeof(a) / sizeof(int);
    quick_sort(a, 0, len - 1);
    return 0;
}

2Comment(s). Blabla or Trackback

  • vilinov at 18:25 Aug 07, 2008 

    貌似while(1)有点多余……

  • 北极冰仔 at 18:29 Aug 07, 2008 

    @vilinov 不,如果没有这个while就不可能找出支点,你想想看。

Blabla ↓

Connecting to server...