A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马上都有 中级黑马   /  2014-5-20 17:44  /  4567 人查看  /  19 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

谁能帮我解释下快速排序的基本原理吗?

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 赞一个!欢迎继续来论坛学习~

查看全部评分

19 个回复

倒序浏览
快速排序就是去数组的一个元素,和其他的所有的元素比较,然后换位置的操作根据你设置的是大换位置还是小换位置,可以完成对数组元素正序、倒叙的输出。
代码示例:
  1. class ArrDemo2   
  2. {  
  3.     public static void main(String[] args)   
  4.     {  
  5.         int[] arr={1,4,3,5,6,2,22,44};  
  6.         arrB(arr);  
  7.         //调用选择排序的函数  
  8.         arrXuan(arr);  
  9.         System.out.println();  
  10.         //遍历数组  
  11.         arrB(arr);  
  12.          
  13.     }  
  14.     //定义函数选择排序的功能  
  15.     public static void arrXuan(int[] arr)  
  16.     {  
  17.         //遍历数组  
  18.         for(int x=0;x<arr.length;x++)  
  19.         {  
  20.             int max ;  
  21.             for(int y=0;y<arr.length;y++)  
  22.                 //比较数组中元素的大小  然后互换位置  
  23.                 if(arr[x]>arr[y])  
  24.                 {  
  25.                     max = arr[y];  
  26.                     arr[y] = arr[x];  
  27.                     arr[x] = max;  
  28.                 }  
  29.         }  
  30.     }  
  31.     //定义遍历数组输出的函数  
  32.     public static void arrB(int[] arr)  
  33.     {  
  34.         System.out.print("arr"+"[");  
  35.         //获取数组中长度 arr.length是获取数组的长度  
  36.         for(int x=0;x<arr.length;x++)  
  37.         {  
  38.             if(x==arr.length-1)  
  39.                 System.out.print(arr[x]);  
  40.             else  
  41.                 System.out.print(arr[x]+",");  
  42.               
  43.         }  
  44.         System.out.print("]");  
  45.     }  
  46.       
  47. }
复制代码

其实这跟比赛打排位似的,你先跟一组的人挨个挑衅去,赢了就换位置前面接着挑衅去,输了你就原地眯着,比你厉害的就接你班挑衅去,听到最后你就是最大的,这就完成一个数组从小到大的快速排序。主要涉及的操作就是取数组值比较,然后数组间元素换位置!!!很简单也很好理解的哦

点评

我怎么感觉上面代码还是冒泡排序,代码功能先打印原数组,然后再冒泡排序并分类,最后打印排序后的数组。  发表于 2014-11-12 11:51
同学,你代码是选择排序。  发表于 2014-5-22 15:14
回复 使用道具 举报
选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分.比如:

6 7 5 8 3 9 4 2 1
1 7 5 8 3 9 4 2 6
1 6 5 8 3 9 4 2 7
1 2 5 8 3 9 4 6 7
1 2 5 8 3 9 4 6 7
1 2 5 6 3 9 4 8 7
1 2 5 4 3 9 6 8 7

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
快速排序的基本思想大概是↓↓
1.先从数列中取出一个数作为基准数。(一般是取第一个)
2.分区:将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.在步骤2分好的区内重复1-2步骤,直到各区间只有一个数。





这是排序一次的过程图 比基准数小的在左边,大的在右边。
然后重复这个过程~

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
解说好详细,学习了
回复 使用道具 举报
格子、 发表于 2014-5-20 20:33
快速排序就是去数组的一个元素,和其他的所有的元素比较,然后换位置的操作根据你设置的是大换位置还是小换 ...

原来如此!谢谢
回复 使用道具 举报
格子、 发表于 2014-5-20 20:33
快速排序就是去数组的一个元素,和其他的所有的元素比较,然后换位置的操作根据你设置的是大换位置还是小换 ...

嗯嗯,有点混淆了,对不起:(,,快速排序的算法其实就是冒泡排序的升级版,也是不断将数据分割成两部分,其中一部分比另一部分所有数据都要小,然后用递归在调用这个方法,来达到排序的目的,稍后会贴出代码,谢谢版主提醒!
回复 使用道具 举报
27ZJQ 来自手机 中级黑马 2014-5-31 09:48:59
8#
二楼解释的不错。
回复 使用道具 举报
还是不明白啊!
回复 使用道具 举报
  1. /*
  2. * 2013年10月24日19:42:55
  3. * @yagnchao
  4. * java 基本语法 ====排序=========
  5. *---------------------------------------------------------------------------------------------------------
  6. * 插入排序: 插入排序属于内部排序法,是对于欲排序的的元素以插入的范式找寻该元素的适当位置,已达到排序目的。
  7. * 插入式排序法(insertion Sorting)的基本思想是: 吧N个待排序的元素堪称为一个有序表和一个无序表,
  8. * 开始时有序表中只包含一个元素,无序表中包含有N-1个元素,排序过程中每次从无序表中取出第一个元素把它的排序吗一次与
  9. * 有序表元素的排序码进行比较,将他插入到有序表中的适当位置,使之成为新的有序表。
  10. * --------------------------------------------------------------------------------------------------------
  11. *
  12. * 冒泡排序: 基本思想是:通过对待排序队列从后向前(从下表较大的元素开始),一次比较相邻元素的排序,
  13. * 就像 水底下的气泡一样逐渐向上冒
  14. *
  15. * 优化
  16. * 因为排序过程中,个元素不断地接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,
  17. * 因此要在排序过程中设置一个标志flag判断元素是否进行过交换,从而减少不必要的比较。
  18. * --------------------------------------------------------------------------------------------------------
  19. *
  20. * 快速排序法(Quicksort):是对冒泡排序的一种改进。他的基本思想是:通过一趟排序将要排序的数据分割成为独立的两部分
  21. * ,qizhognyibufnedesuoyoushuju都比另外一部分的所有数据都要小,然后再按照此方法对这两部分数据分别进行快速排序,
  22. * 整个排序过程可以递归进行,以此达到整个数据变成有序序列。
  23. * --------------------------------------------------------------------------------------------------------
  24. *
  25. * 选择排序: 选择是排序也属于内部排序发,是从预排序的数据中,按指定的规则选择出某一元素,经过和其他
  26. * 元素重整,再依原则交换位置后达到排序的目的。
  27. * --------------------------------------------------------------------------------------------------------
  28. * */
  29. package com.test1;
  30. import java.util.Calendar;
  31. public class Sort
  32. {
  33. public static void main(String[] args)
  34. {
  35.   int [] m= {1,3,2,5,4,6,9,7,8,12,11,10};

  36.   int len = 100000;
  37.   int [] mm = new int[len];
  38.   for(int i=0; i<len; ++i)
  39.   {
  40.    int t = (int)(Math.random()*100000);
  41.    mm[i] = t;
  42.   }
  43.   Bubble bu = new Bubble();
  44.   Select se = new Select();
  45.   Insert in = new Insert();

  46.   //测试间
  47.   Calendar cal = Calendar.getInstance();
  48.   System.out.println(cal.getTime());;
  49. //         bu.sort(m);
  50. //         se.sort(mm);
  51.   in.sort(mm);
  52.   cal = Calendar.getInstance();
  53.   System.out.println(cal.getTime());

  54.   for (int i=0; i<m.length; ++i)
  55.   {
  56.    System.out.print(m[i] + " ,");
  57.   }
  58. }
  59. }
  60. //冒泡排序法
  61. class Bubble
  62. {
  63. public void sort(int arr[])
  64. {
  65.   int temp=0;
  66.   for(int i=0; i<arr.length-1; i++)
  67.   {
  68.    for(int j=0; j<arr.length-1-i; j++)
  69.    {
  70.     if(arr[j] > arr[j+1])
  71.     {
  72.      temp = arr[j];
  73.      arr[j] = arr[j+1];
  74.      arr[j+1] = temp;
  75.     }
  76.    }
  77.   }
  78. }
  79. }
  80. //选择排序法
  81. class Select
  82. {
  83. public void sort(int arr[])
  84. {
  85.   int temp = 0;

  86.   for(int i=0; i<arr.length-1; ++i)
  87.   {
  88.    int min = arr[i];//最小数
  89.    int minIndex = i;//记录最小数的下表
  90.    
  91.    for(int j=i+1; j<arr.length; ++j)
  92.    {
  93.     if(min > arr[j])
  94.     {
  95.      min = arr[j];//修改最小数
  96.      minIndex = j;//将最小数的下标
  97.     }
  98.    }
  99.    
  100.    //已经找到最小的数了 然后进行交换
  101.    temp = arr[i];
  102.    arr[i] = arr[minIndex];
  103.    arr[minIndex] = temp;
  104.   }
  105. }
  106. }
  107. //插入式排序法法。
  108. class Insert
  109. {
  110. public void sort(int [] arr)
  111. {
  112.   for(int i=1; i<arr.length; ++i)
  113.   {
  114.    int insertVal = arr[i];//insertVal准备和前一个数比较
  115.    
  116.    int index = i-1;
  117.    while(index>=0 && insertVal<arr[index])
  118.    {
  119.     //将把arr[index]向后移动
  120.     arr[index +1] = arr[index];
  121.    
  122.     //让index向前移动
  123.     index--;
  124.    }
  125.    //将insertVal插入到适当的位置
  126.    arr[index+1] = insertVal;
  127.   }
  128. }
  129. }
  130. //交换式排序法---快速排序法
  131. class QuickSort
  132. {
  133. public void sort(int left, int right, int[] arr)
  134. {
  135.   int l = left;
  136.   int r = right;
  137.   int pivot = arr[(l+r)/2];
  138.   int temp = 0;

  139.   while(1<r)
  140.   {
  141.    while(arr[1]<pivot) l++;
  142.    while(arr[r]>pivot) r--;
  143.    
  144.    if(1 >= r) break;
  145.    
  146.    temp = arr[1];
  147.    arr[1] = arr[r];
  148.    arr[r] = temp;
  149.    
  150.    if(arr[1] == pivot) --r;
  151.    if(arr[r] == pivot) ++l;
  152.    
  153.   }
  154.   if (l == r)
  155.   {
  156.    l++;
  157.    r--;
  158.   }

  159.   if(left < r) sort(left, r, arr);
  160.   if(right > l) sort(l, right, arr);
  161. }
  162. }
复制代码
回复 使用道具 举报

这是 我之前 做的   排序的   笔记  希望  对你  有帮助 !!   分享  让你我 共同进步!!
回复 使用道具 举报
听说以后工作是说Arrays.sort这个方法对数组进行排序。
回复 使用道具 举报
27ZJQ 中级黑马 2014-6-11 23:03:48
13#

写的真详细,赞一个!
回复 使用道具 举报
那窗_那世 发表于 2014-5-21 18:05
选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准 ...

看不懂啊 {:3_55:}
回复 使用道具 举报
学习了啊{:3_57:}
回复 使用道具 举报
我是来学习的
回复 使用道具 举报
还是有点模糊
回复 使用道具 举报
icm 中级黑马 2015-12-17 22:24:34
18#
来学习学习。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马