快速排序

一、原理

1. 从待排序区间选择一个数,作为基准值(index);
2. Partition: 遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边,将比基准值大的(可以包含相等的)放到基准值的右边;
3. 采用分治思想,对左右两个小区间按照同样的方式处理,直到小区间的长度 == 1,代表已经有序,或者小区间的长度 == 0,代表没有数据。

二、图解

1.以{1, 3, 6, 5, 0, 2}为例,将较小的数换在左边,反之在右边。
快速排序
将最右边的数作为基准值,right先从右边向左找第一个比基准值2小的数,找到为0;left再从左边向右找第一个比基准值大的数,找到为3,交换这两个数。

2.
快速排序
在1.的基础上,right先走,从右往左找第一个比基准值2小的数,我们发现,此时right和left相遇了,将相遇的值与基准值2比较,相遇的值比基准值大,所以我们交换两个数。

3.
快速排序
现在,第一趟比较已经结束,数字2相当于已经归位了,所以我们以2为分界线,分别比较2左边的数和2右边的数,比较方法和上面的一样。最后我们会得到一组有序的数。

三、代码实现

public static void quickSort(int[] array) {   //快速排序

        quickSortHelper(array, 0, array.length - 1);
    }
    private static void quickSortHelper(int[] array, int left, int right) {
        if (left >= right) {
            return;
        }
        int index = partition(array, left, right);
        quickSortHelper(array,left, index - 1);
        quickSortHelper(array, index + 1,right);
    }
    private static int partition(int[] array, int left, int right) {
        int index = right; //基准值
        while (left < right) {
            while (left < right && array[left] <= array[index]) {
                left++;
            }
            while (left < right && array[right] >= array[index]) {
                right--;
            }
            swap(array, left, right);
        }
        swap(array, left, index);
        return left;
    }
    public static void swap (int[] array, int x, int y) {
        int tmp = array[x];
        array[x] = array[y];
        array[y] = tmp;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章