时间:2021-05-20
一.经典快排思想
前提条件:给定一个无序数组arr
二.通过荷兰国旗问题改进快排
什么是荷兰国旗问题?
已知一个整形数组arr,和一个整数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。
解决思路:
遍历数组
附上代码:
public static void NetherlandsFlag(int[] arr, int L, int R, int num) { int i = L; int p1 = L-1; int p2 = R+1; //终止条件:当前数的位置在大于区的前一个 while(i < p2) { if(arr[i] < num) { //当前数比num小,放左边,i位置上的数和L上的数进行交换,并且i++,L++ swap(arr, i++, ++p1); } else if(arr[i] == num) { //当前数和num相等,i++ i++; } else { //当前数比num大,放右边,i位置上的数和R上的数进行交换,并且i++,R-- swap(arr, i, --p2); } }}我们可以发现,荷兰国旗问题和经典快排不同的就只是将<=num改为了< num和=num两部分,借用这个思想使得原来每次只可以让一个数找到正确的位置改进为了每次至少让一个数找到位置。
三.在这基础上将其改为随机快排
随机快排改进的地方只是在选取数的时候,将每次都选取最后位置的数改为选取随机的一个数作为num,这样做的好处是什么呢?
1.选取最后一个数:如果是一个已经排好序的数组,每次找到位置之后,左边是要进行排序的部分,数组长度是原长度-1,它的时间复杂度就是O(N^2);如果每次找到的数都是中间的位置,它的时间复杂度就只有O(logN)
2.然而以随机数作为选取的标准num的时候,因为是随机的,就只能通过数学期望去计算它的时间复杂度,时间复杂度是O(logN)
下面附上最终的快排代码及注释
/* * swap(int[] arr, int i, int j);是将arr数组的i和j位置上的数交换的方法 */public static void quickSort(int[] arr) { // 如果为空或长度为1不需要排序,直接返回 if(arr == null || arr.length < 2) return; else quickSort(arr, 0, arr.length - 1);}// 递归排序public static void quickSort(int[] arr, int L, int R) { if(L < R) { /* * 随机快排的随机就在这 * 是随机选取了一个数,和 R 进行了交换,然后使用这个数作为num, * 所以每次选取的num是随机的, * 在计算时间复杂度时,是没有最优最差情况的 * 而是通过一个长期的数学期望计算的,结果是O(N*logN) */ swap(arr, L + (int) (Math.random() * (R - L + 1)), R); int[] border = partition(arr, L, R); // 小于区和大于区进行递归 quickSort(arr, L, border[0] - 1); quickSort(arr, border[1] + 1, R); }}// 将给定数组划分为小于区、等于区和大于区public static int[] partition(int[] arr, int L, int R) { int num = arr[R]; int less = L - 1; int more = R + 1; int curr = L; // 分为小于区等于区和大于区 while(curr < more) { if(arr[curr] < num) { swap(arr, curr++, ++less); } else if(arr[curr] > num) { swap(arr, curr, --more); } else { curr++; } } //返回等于区的左右边界的下标,通过下标确定小于区和大于区递归时的参数 return new int[] {less + 1, more - 1};}总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
快排是python经典算法之一。1、下面讲解的是什么是快排和快排的图示。2、快排是一种解决排序问题的运算方法。3、快排的原理:在数组中任意选择一个数字作为基准,
快速排序作为一种高效的排序算法被广泛应用,SUN的JDK中的Arrays.sort方法用的就是快排。快排采用了经典的分治思想(divideandconquer)
面试中会经常遇到手撕代码的情况,而求TopK的是经常遇到的题目。下面我就用Java来实现。主要通过两种方法实现,快排思想以及堆排序的思想,两者的复杂度为O(Nl
最近有很多客户问百度SEO快排是什么,怎么做到的,如何实现SEO快排。其实所谓的SEO快排就是通过某种技术手段,快速的将网站关键词排名优化到搜索引擎首页的技术。
快速排序算法,简称快排,是最实用的排序算法,没有之一,各大语言标准库的排序函数也基本都是基于快排实现的。本文用python语言介绍四种不同的快排实现。1.一行代