码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序 详解

时间:2015-10-28 14:09:30      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

这张图片表示的是快速排序的非随机排法。可以看出,它是选择区域的最右值作为划分key。

1.两个while循环两头向中间走,走完后箭头两端:左边一头大于key值,右边一头小于key值。(要是等于怎么办?等于可以看作小于或者大于。这也就是快速排序不稳定的原因。)

2.替换箭头两处的值。

3.重复步骤1。直到左 >= 又。

4.此时已经完成了一次划分。(如果是第一次的话,key值在最后面没有变,数组已经被划分为了两部分,前面均小于key,后面均大于key。就像下图

技术分享

当然,key的位置也要确定下来,只需要把它和大于key的第一个值互换就ok。如下图

技术分享)这样就是一次完美的划分了。

5,左边递归,右边递归,搞定。

代码便如下这般:


void swap(int *a, int *b){
    int c = *a;
    *a = *b;
    *b = c;
}
void qsort(int a[], int low, int high){
    int key = a[last];
    int p1 = low;
    int p2 = high;
    while(p1 < p2){
        while(p1 < p2 && a[p1] < key)
            ++p1;
        while(p1 < p2 && a[p2] > key)
            --p2;
        swap(&a[p1],&a[p2]);
    }
    swap(&a[p2],a[high]);
    qsort(a,low,p1-1);
    qsort(a,p1+1,high);
}

百度百科上面的有点绕:

void Qsort(int a[], int low, int high)
{
    if(low >= high)
    {
        return;
    }
    int first = low;
    int last = high;
    int key = a[first];
    while(first < last)
    {
        while(first < last && a[last] >= key)
            --last;
        a[first] = a[last];
        while(first < last && a[first] <= key)
            ++first;
        a[last] = a[first];    
    }
    a[first] = key;
    Qsort(a, low, first-1);
    Qsort(a, first+1, high);
}

但是效果是一样的。

后面还会有一些随机法。

快速排序 详解

标签:

原文地址:http://www.cnblogs.com/wangchz13/p/4916885.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!