排序算法——快速排序

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。

 

总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速排序,快速搞定。

 

快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

该方法的基本思想是:

1.先从数列中取出一个数作为基准数。

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。

 

下面上个霸气的图来描述下整个算法的处理过程。

排序算法——快速排序

 

这是为什么呢?

快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)。其实快速排序是基于一种叫做“二分”的思想。我们后面还会遇到“二分”思想,到时候再聊。

以上内容来自:

白话经典算法系列之六 快速排序 快速搞定

坐在马桶上看算法:快速排序

 

由于他的代码似乎有点问题,这里又写了一个代码

  1. package algorithm;
  2. public class Sort_quick {
  3.     //打印数组
  4.     public static void printArr(int[] arr) {
  5.         for (int i:arr)
  6.             System.out.print(i+" ");
  7.         System.out.println();
  8.     }
  9.     //获得基准位的位置
  10.     public static int partition(int []arr,int left,int right){
  11.         //固定的切分方式
  12.         int key=arr[left],temp;
  13.         while(left<right){//两个哨兵相遇则停止
  14.             while(left<right&&arr[right]>=key){//从右边开始找,找一个小于基准数的,找到则停止
  15.                 right--;
  16.             }
  17.             arr[left]=arr[right];
  18.             while(left<right&&arr[left]<=key){//从左边开始找,找一个大于基准数的,找到则停止
  19.                 left++;
  20.             }
  21.             arr[right]=arr[left];
  22.         }
  23.         //这时候arr[left]和arr[right]很可能相等,且还差key的值没排进去
  24.         arr[right]=key;
  25.         //打印每一轮排序的结果
  26.         printArr(arr);
  27.         return right;
  28.     }
  29.     public static void quickSort(int[] arr,int left ,int right){
  30.         if(left>=right){
  31.             return ;
  32.         }
  33.         int index=partition(arr,left,right);
  34.         quickSort(arr,left,index-1);
  35.         quickSort(arr,index+1,right);
  36.     }
  37.     public static void main(String args[]) {
  38.         int[] arr = {6,1,2,7,9,3,4,5,10,8};
  39.         quickSort(arr,0,arr.length-1);
  40.     }
  41. }

 

  • 微信
  • 赶快加我聊天吧
  • weinxin
  • 博客交流群
  • 海纳百川,大家来水
  • weinxin
言曌

发表评论

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen: