排序算法(快速排序)

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份的左右位置都按次序压栈,到最后栈顶的两个元素可以理解成最小两个需要排序的位置,排好了就出栈

 

以上是关于排序算法(快速排序)的主要内容,如果未能解决你的问题,请参考以下文章

一行Python代码搞定快速排序算法

交换排序(冒泡排序快速排序的算法思想及代码实现)

排序算法 | 快速排序(含C++/Python代码实现)

[leetcode]排序算法(冒泡排序,选择排序,插入排序,快速排序,计数排序)

十大经典排序算法总结(快速排序)

快速排序算法详解及代码实现