码迷,mamicode.com
首页 > 编程语言 > 详细

排序算法(快速排序)

时间:2018-08-24 20:04:43      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:img   递归调用   一段   条件   分享图片   出栈   算法   http   []   

  快排其实很简单,理解我个人觉得没有问题,可是代码实现就有点无力,泪奔

快排图解

技术分享图片

  其实我觉得这个图在不理解的人眼里明不是很生动形象,我来解释一下:找一个参照数(第一个或者最后一个都无所谓),然后先从右边开始扫描,找到比这个数小的,再从左边开始扫描,找到比这个数大的,两个交换,最后的结果是,左边的数全部比基数大,右边的数全部比基数小;左边右边重复这个操作最后就有序了

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

 

排序算法(快速排序)

标签:img   递归调用   一段   条件   分享图片   出栈   算法   http   []   

原文地址:https://www.cnblogs.com/ccxka/p/9531735.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!