amor详解 快速排序 使用以及心得

 

 这是针对快速排序的详解,可以还不是很清楚,希望大家指正原文来自 http://www.liaoguodong.cn  作者 amor  欢迎大家前来!!

 

   前言:快速排序作为专家测试,公认的最快的排序算法,相比冒泡排序,选择排序,插入排序等低级排序而言,是一个优秀的排序算法.对于初学者和兴趣爱好者有着较好的教学目的.在这人,我详解一下快速排序的原理,以及心得

  

快速排序的原理:

第一步:取第一个值为参考值mid

第二步:设立两个指针(下标),i指向第一个元素,j指向最后一个元素

第三步:从j开始逐步向前找一个小于mid的数与其交换

第四步:从i开始逐步向后找一个大于mid的数与其交换

如果i,j不相遇,那么重复第三步和第四步

 

    快速排序的思想:将一个大的问题划分为一个小的问题,再这个小的问题细分

 

   快速排序之所以快速,首先来说在时间上:快速排序的执行时间为=nlog2N 

而低级排序为=n*n

那么就显而易见了,例如一个100个数字,那么低级排序的时间为100*100=10000O

注意O,为时间单位  

而同样的100个数字,快速排序的时间为=100*log2100  =700

所以,在时间上,快速排序大大的超过了以往的低级排序速度

 

此图请结合下面代码一起阅读

 

 

下面是代码,使用,测试方法,直接将以下代码,复制,执行就可以了!

 

 

 


   
  1. import java.util.Arrays; 
  2.  
  3. public class 快速排序 { 
  4.  
  5. public static void fastsort(int []a ,int left,int right){ 
  6.  
  7. /* 
  8.  
  9.  * 快速排序的原理: 
  10.  
  11. 第一步:取第一个值为参考值mid 
  12.  
  13. 第二步:设立两个指针(下标),i指向第一个元素,j指向最后一个元素 
  14.  
  15. 第三步:从j开始逐步向前找一个小于mid的数与其交换 
  16.  
  17. 第四步:从i开始逐步向后找一个大于mid的数与其交换 
  18.  
  19. 如果i,j不相遇,那么重复第三步和第四步 
  20.  
  21.  * */ 
  22.  
  23. //取参考值 
  24.  
  25. int mid = a[left]; 
  26.  
  27. //设定两个指针 
  28.  
  29. int i=left;  
  30.  
  31. int j=right; 
  32.  
  33. /* 
  34.  
  35.  *  
  36.  
  37.  * */ 
  38.  
  39. while(i<j){ 
  40.  
  41. //从j开始向前找一个小于mid的数与其交换  保证i和j不相等 
  42.  
  43. /* 
  44.  
  45.  * 此处不易懂,所以详细讲解一下。   当a[j]>mid的时候,那么表示此数比mid大,那么这一位不动,然后把j的位置向前移动,然后又判断 
  46.  
  47.  * 当条件不符合的时候表示a[j]<mid,那么就是这个值比参考值要小,那么更进入if判断,和mid交换位置,从而达到mid的左边的值全部比mid大 
  48.  
  49.  *   注意:a[j]>=mid当不等于的时候,那么当数组有等等的数的时候,循环会陷入死循环的位置.切记!!! 
  50.  
  51.  * */ 
  52.  
  53. while(i<j&&a[j]>=mid){ 
  54.  
  55. j--; 
  56.  
  57.  
  58. if (i<j) { 
  59.  
  60. int b=a[i]; 
  61.  
  62. a[i]=a[j]; 
  63.  
  64. a[j]=b; 
  65.  
  66.  
  67. /* 
  68.  
  69.  * 此处同上,保证mid右边的值全部比mid小 
  70.  
  71.  *  
  72.  
  73.  * */ 
  74.  
  75. //从i开始向后找一个大于mid的数与其交换 
  76.  
  77. while(i<j&&a[i]<=mid){ 
  78.  
  79. i++; 
  80.  
  81.  
  82. if (i<j) { 
  83.  
  84. int b=a[i]; 
  85.  
  86. a[i]=a[j]; 
  87.  
  88. a[j]=b; 
  89.  
  90.  
  91.  
  92. /* 
  93.  
  94.  * 例如:原数组为int[] a={5,1,7,9,3,2,4,6,8}; 
  95.  
  96.  * 那么在这人的排序后,会变成 5居中,1,3,2,4在5的右边,但是不一定是有顺序的,,只能保证5的右边都比5小,那么,左边同理 
  97.  
  98.  * */ 
  99.  
  100. //i j相遇,就以mid为断点,左边的全小,右边全大 
  101.  
  102. //左边有数才快速排序 
  103.  
  104. if(left<i){ 
  105.  
  106. /*在这儿使用了递归,自己调用自己的方法,当i和j相等时候就表示已经完成了排序 
  107.  
  108.  * */ 
  109.  
  110. fastsort(a, left, i-1); 
  111.  
  112.  
  113. if(j<right){ 
  114.  
  115. fastsort(a, j+1, right); 
  116.  
  117.  
  118.  
  119. public static void main(String[] args) { 
  120.  
  121. int [] a={4,5,5,3,2,4,6,7,9,3}; 
  122.  
  123. //  int[] a={5,1,7,9,3,2,4,6,8}; 
  124.  
  125. /* 
  126.  
  127.  * Arrays.sort(a);这是一个比较简单的排序方式,但是原理仍然是使用的快速排序,只是被封装了而已 
  128.  
  129.  * */ 
  130.  
  131. //  Arrays.sort(a); 
  132.  
  133. fastsort(a, 0, a.length-1); 
  134.  
  135. for(int i=0;i<a.length;i++){ 
  136.  
  137. System.out.print(a[i]+"\t"); 
  138.  
  139.  
  140.  

 

 

 

   这是针对快速排序的详解,可以还不是很清楚,希望大家指正原文来自 http://www.liaoguodong.cn  作者 amor  欢迎大家前来!!