排序之——快速排序

111 阅读2分钟

快速排序

1、定义

快速排序是最常用的排序算法,通过元素之间的比较然后交换位置达到排序目的,和冒泡排序一样,但是不同的是快速排序采用分治法大幅度提高了排序效率。

2、代码

代码框架

void quickSort(int[] nums, int lo, int hi) {
        if(lo >= hi) return;
        int p = partition(nums,lo,hi);
        quickSort(nums,lo,p-1);
        quickSort(nums,p+1,hi);
    }

关键点在于partition函数,让基准元素的[lo...p-1]的值小于nums[p],[p+1...hi]部分值大于nums[p],那么p位置的元素就被放置在正确的地方,最后返回该索引位置,所以快速排序核心在于递归的将元素放置正确的地方,直到达到边界条件就终止从而达到整体排序效果。 用数组[4,5,7,3,2,1,6,8]举例,通常拿第一个元素当作基准元素,也就是4,然后定义左右指针指向第二个元素和末尾元素,挨个和4对比,将比4小的放置左侧,反之放置右侧,最后将4放置正确的位置。

int partition(int[] nums, int lo, int hi) {
        //要被交换的元素
        int p = nums[lo];
        int i = lo + 1,j = hi;
        //采用头尾指针方法
        while (i <= j){
            //内部双while是为了保证找到符合条件的元素进行交换,如果索引重合就终止外围while
            while (i < hi && nums[i] <= p){
                i++;
            }
            while (j > lo && nums[j] > p){
                j--;
            }
            if(i>=j) break;
            swap(nums,i,j);
        }
        //让被交换的元素放置正确的位置
        swap(nums,lo,j);
        return j;
    }

交换元素完成后,开始递归基准元素的左半边数组和右半边数组,做相同的交换逻辑即可完成最终排序,当然注意的是选定好的基准元素不在参与排序,因为已经排好了。 整个过程有点类似于二叉树先序遍历,不要把目光带入递归的细节中,只需要关注于partition函数,难点在于边界的把控,避免让程序进入死循环溢出!

觉得写的好可以关注下公众号,可以免费领大数据,java,资料~~