快速排序——栈和数组——两种思路(递归+挖坑填埋法)

来源:互联网 发布:极简生活后的变化知乎 编辑:程序博客网 时间:2024/05/29 03:25

原理:选取一个数,使得这个数的左边比这个数小,右边的数比这个数大。

接下来的问题是如果实现这个过程。


第一种用栈做


用栈做就太简单了。

直接锁定1。

从3开始往后找。

找到小的数,直接插入到1的前面。

再对每一部分进行递归。


这里是找到了 0 0,新序列是 0 0 1 3 6 2 8 4 8

接下来就是 0 0里找

再是3 6 2 8 4 8里找。

。。。


这里用List模拟的栈

// 136284008List实现太轻松了void calculate(List<Integer> list, int startIndex, int endIndex) {// origin index 0 size-1    if (startIndex == endIndex || startIndex + 1 == endIndex) {        return;    }    int firstNum = list.get(startIndex);    int index = startIndex;    for (int i = startIndex + 1; i <= endIndex; i++) {        int num = list.get(i);        if (num < firstNum) {            list.add(startIndex, num);            list.remove(i + 1);            index++;        }    }    calculate(list, startIndex, index - 1);    calculate(list, index + 1, endIndex);}



第二种用数组做,略微麻烦一点。

没有List那么方便,需要挖坑。


我们依然选取1作为参照数。

用X保存这个1。1就仿佛成了一个被挖出来的坑,因为他的数已经被保存了,所以这个位置上可以任意赋值了。



之后从最后一位开始找比1小的数。8不符合。0是符合的。

所以这个0就填到刚刚第一位的坑里,而0的那个位置有多出来一个坑。



接下来就是要从左边开始找大的数,3直接就符合了。放到刚刚0的坑里。而3又多出来一个坑。


接下来又是从右边找。。。直到左右相遇。

//数组实现void calculate(int a[], int startIndex, int endIndex) {    if (startIndex == endIndex || startIndex + 1 == endIndex || startIndex > endIndex) {        return;    }    int x = a[startIndex];    int ken = startIndex;    int s = startIndex;    int e = endIndex;    startIndex ++;    boolean flag = true;    while (startIndex <= endIndex) {        if (flag) {            if (x > a[endIndex]) {                a[ken] = a[endIndex];                ken = endIndex;                flag = false;            }            endIndex --;//0        } else {            if (x < a[startIndex]) {                a[ken] = a[startIndex];                ken = startIndex;                flag = true;            }            startIndex ++;        }    }    a[ken] = x;    calculate(a, s, ken - 1);    calculate(a, ken + 1, e);}