严版快速排序Partion方法

来源:互联网 发布:淘宝网婴儿用品 编辑:程序博客网 时间:2024/05/23 14:27

严版快速排序Partion方法

@(算法学习)

int Partion(int A[], int low, int high){    int pivot = A[low]; // 第一个元素设为pivot值    while(low < high)    {        while(low < high && A[high] >= pivot)        {            --high; // 从右往左找到第一个比pivot小的停下来        }        A[low] = A[high]; //把比pivot小的数移到pivot在的位置,因为pivot已经存储了,所以可以直接覆盖        // 此时high指向的位置空出来了,从左往右寻找比pivot大的值,欢迎入住high的老家        while(low < high && A[low] <= pivot)        {            ++low;//直到low指向第一个比pivot大的值停下来        }        A[high] = A[low]; // low指向的值要搬到high处,则low处的位置空了,且其左边都是不大于pivot的,右边    }    // 上面的大循环是low == high才结束,因此不是从右到左一次再从左到右一次就结束,而是直到pivot真的比左边都大比右边都小时结束    A[low] = pivot; //此时    return low;}

举个例子:
28, 16, 32, 12, 60, 2, 5, 72

首先以pivot = 28, 从右往左找比第一个28小的,找到5,将5覆盖到28处:

5, 16, 32, 12, 60, 2, 5, 72

划线的5是可以被覆盖的。
再从左往右找第一个比28大的,找到32,将其填到划线的5处。

5, 16, 32, 12, 60, 2, 32, 72

注意此时high指向的是粗体的32,low指向的是划线的32.

这时候low仍然小于high,因此继续循环。

从右往左找比28小的,找到2,填充到划线的32处。

5, 16, 2, 12, 60, 2, 32, 72

high指向的是划线的2,low指向的是粗体的2.

low < high仍然成立。

从左往右找比28大的,找到60,覆盖划线的2.

5, 16, 2, 12, 60, 60, 32, 72

此时可以看到low就在high左边了。下一轮是从右往左,找比28小的,–high一次,与low相等,于是外层循环条件被打破,low与high都指向划线的60.

这个位置是用来存pivot的。把pivot放进来:

5, 16, 2, 12, 28, 60, 32, 72

这样才能说一次Partion结束,此时28就是最终的位置。左边都比28小,右边都比28大。

注意:快排是不稳定的。比如:2,1,1,交换一次变为1, 1, 2,1的相对位置改变,所以不稳定。

1 0
原创粉丝点击