网上很多关于快速排序的教程,嗯,不错,版本也很多,有的试了一下还报错。。呵呵

于是乎低智商的朕花了好几天废了8张草稿纸才弄明白。。

快速排序的采用的分治啊挖坑填数啊之类的网上到处都是,具体过程自己百度吧,这里就讲讲我自己写的代码。还有,快排是一种不稳定的排序算法,就是说,当整个数列是无序状态时,效率高,但是,当把一个从大到小的通过排序转成从小到大的,那就呵呵了,随时StackOverflow。。

OK,先上代码(排序结果是从小到大)

         static void QuickSort(int[] num, int left, int right)
{
if (left >= right)
return; int key = num[left];
int i = left;
int j = right; while (i < j)
{
while (i < j && key < num[j])
j--;
if (i >= j)
{
num[i] = key;
break;
}
num[i] = num[j]; while (i < j && key >= num[i])
i++;
if (i >= j)
{
num[i] = key;
break;
}
num[j] = num[i];
}
num[i] = key; QuickSort(num, left, i - );
QuickSort(num, i + , right);
}

参数中的num就不用说了吧,left和right分别代表排序待排序数组的开始和结尾的索引,当然默认排序整个数组的话就:

QuickSort(a, , a.Length - );

假设待排序数组是a,排序索引是0到最后一项的元素。

快排使用分治,选取一个关键值key(代码中的第6行,并且默认使用待排序数组的第一个值),把比它大的和比它小的分别放在两边。

具体就是先从数组右边(j值记录的索引)开始找比key小的数,对应代码的12、13行,至于为什么要i < j,呵呵,待会儿说。

循12行环的意义是,如果当前num[j]比key大,j就自减,直到key>num[j]就找到了比key小或相等的数了呗。

又由于排序的数千变万化,所以有的情况下j一路减下去或记录左边索引的i一路加上去,就有可能i>=j,于是就有了10、12、14、21、23行判断i和j关系的语句了,因为如果i都>=j了,就表示分完了啊。

于是先假设i一直<j,通过12行的循环找到了比key小或等于的值,就把左右的数交换,不用担心key不见,因为有第6行。。

之后又通过21行的循环找比key大的值,再在28行交换。这样下来10行的大循环完了之后,数组就留了一个“空位”(这个“空位”当然有数,只是它应该被key填充),再在30行用key填充。

之后31、32行递归(别说你不知道啥意思),再对key两边的数进行排序。

排序完成后,i值就对应key的索引,所以递归调用的参数就那样填。。

以上纯属个人理解,有错误的地方还请指出!

最新文章

  1. CSS十问——好奇心+刨根问底=CSSer
  2. ListView中的setOnScrollListener
  3. web前端之HTML的前世今生
  4. ASP.NET动态加载用户控件的方法
  5. .net web弹出对话框
  6. STM32F0xx_TIM基本延时配置详细过程
  7. netstat命令[转]
  8. BROCADE 300和MD3200扩展柜FC SAN,截图
  9. Android SoundPool 的使用以及原理分析
  10. Android 上滑上拉菜单SlidingDrawer 不全屏显示的方法
  11. 记录一种下载https网址中的mp4文件的方法
  12. 算法笔记--次小生成树 &amp;&amp; 次短路 &amp;&amp; k 短路
  13. mac系统如何在当前目录下打开终端
  14. 原型设计(“留拍”Axure整体操作过程)
  15. PAT L3-021 神坛
  16. [转]MySQL中函数CONCAT及GROUP_CONCAT
  17. Haskell语言学习笔记(70)NonEmpty
  18. MySQL二进制日志文件Binlog的三种格式以及对应的主从复制中三种技术
  19. [eclipse]添加python默认模板,在首行添加编码方式(# -*- coding: utf-8 -*-)
  20. [LeetCode] 256. Paint House_Easy tag: Dynamic Programming

热门文章

  1. [LeetCode] Palindrome Permutation II 回文全排列之二
  2. C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(三:附源码)
  3. Android开发之应用程序的安装
  4. 用vue.js学习es6(三):数组、对象和函数的解构
  5. python学习之路 第一天
  6. ReactJS尝鲜:实现tab页切换和菜单栏切换和手风琴切换效果,进度条效果
  7. 冰冻三尺非一日之寒--jQuery
  8. Android 轮换页面+TabHost 实例
  9. sass 安装、配置,css规则
  10. 安装php openssl扩展