排序算法(快速排序)
Posted ccxka
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法(快速排序)相关的知识,希望对你有一定的参考价值。
快排其实很简单,理解我个人觉得没有问题,可是代码实现就有点无力,泪奔
快排图解
其实我觉得这个图在不理解的人眼里明不是很生动形象,我来解释一下:找一个参照数(第一个或者最后一个都无所谓),然后先从右边开始扫描,找到比这个数小的,再从左边开始扫描,找到比这个数大的,两个交换,最后的结果是,左边的数全部比基数大,右边的数全部比基数小;左边右边重复这个操作最后就有序了
既然每一次都要将一段数组划分成2段,中间操作一样,我们就可以使用递归来实现,如果不会递归就自己去掌握了
递归实现
1 //快排的递归调用 2 public void QuickSort(int[] nums, int left, int right){ 3 //这里是出口条件 4 if(left > right) return; 5 6 int i = left; //左边 7 int j = right; //右边 8 int x = nums[left]; //基准数 9 10 while(i < j){ 11 //从右开始寻找比基准数小的元素 12 while(i < j && nums[j] > x){ 13 j--; 14 } 15 //从左开始找比基准数大的元素 16 while(i < j && nums[i] <= x){ 17 i++; 18 } 19 //交换 20 if(i < j){ 21 int p = nums[i]; 22 nums[i] = nums[j]; 23 nums[j] = p; 24 } 25 } 26 //基数归位(这里的nums[left]不能写成x,因为这是数组里面的数据进行交换,用x的话里面有个元素根本没动) 27 int temp = nums[i]; 28 nums[i] = nums[left]; 29 nums[left] = temp; 30 //排左边 31 QuickSort(nums, left, i-1); 32 //排右边 33 QuickSort(nums, i+1, right); 34 }
非递归的实现
我们在每一次的递归中都用到了两个元素,左边位置和右边位置,现在我们可以用栈来模拟,栈里面的元素可以看成一对一对的(一左一右),每一次把数组划分成2份的左右位置都按次序压栈,到最后栈顶的两个元素可以理解成最小两个需要排序的位置,排好了就出栈
以上是关于排序算法(快速排序)的主要内容,如果未能解决你的问题,请参考以下文章