排序算法-快速排序

Posted 白日梦想家12138

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法-快速排序相关的知识,希望对你有一定的参考价值。

参考博文:http://www.cnblogs.com/MOBIN/p/4681369.html

快速排序是冒泡排序的改进版,也是最好的一种内排序,在很多面试题中都会出现

  思想:

    1.在待排序的元素中任取一个元素作为基准(通常选第一个元素,但最好的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素

    2.将待排序的元素进行分区,对基准元素大的元素放到它的右边,比其小的放在它的左边

    3.对左右两个分区重复以上步骤直到所有元素都是有序的

  所以可以把快速排序联想成东拆西补或西拆东补,一边拆一边补,直到所有元素达到有序状态,

  左边被拆了,就要遍历右边的元素去补,右边被拆了,就遍历左边的元素去补

  实现代码:

 1 public class QuickSort {
 2     
 3     public static void main(String[] args) {
 4         int[] arr = {5,7,1,8,4};
 5         int _left = 0;
 6         int _right = arr.length-1;
 7         
 8         System.out.print("排序前:" );
 9         for(int num:arr) {
10             System.out.print(num);
11         }
12         
13         quickSort(arr,_left,_right);
14         System.out.print("----排序后:" );
15         for(int num:arr) {
16             System.out.print(num);
17         }
18     }
19 
20     private static void quickSort(int[] arr, int _left, int _right) {
21         int left = _left;
22         int right = _right;
23         int base = 0;
24         if(left < right) {
25             base = arr[left];                //我们将base元素单独拿出,这样base元素的位置就出现了一个坑
26             while(left != right) {
27                 while(left < right && arr[right] >= base)         //从右往左找 小于 base 的元素,将其填入base左边的坑中
28                     right--;                                    //这个 while的目的,就是不停地移动right指针,直到某个元素小于base,
29                 arr[left] = arr[right];                            //小于base的元素是不应该出在右边的,所以我们把它放到左边的坑中,这样在右边又空出来了一个坑
30                 
31                 while(left < right && arr[left] <= base)        //从左往右找 大于 base 的元素,将其填入base右边的坑中,while的目的和上面类似        
32                     left++;                                        //用左边大于base的元素填充右边的坑,
33                 arr[right] = arr[left];
34             }
35             
36             arr[right] = base;        //将基准值回归填充到中间
37             
38             quickSort(arr,_left,left - 1);    //对基准元素左边的元素递归排序
39             quickSort(arr,right + 1,_right);//对基准元素右边的元素递归排序
40         }
41     }
42 }

 

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

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

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

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

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

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

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