快速排序
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,资料~~