前言

快速排序是最常见,也是面试中最容易考的排序方法,这里做一下总结

算法说明

其实这里说的很清楚了:http://blog.csdn.net/morewindows/article/details/6684558

不过我还是打算按自己的逻辑再描述一下,如果看不懂,再去看这位大神的贴子啦。

快速排序其实用的也是分而治之的思路,流程是:

1、假如做的是降序排序;先拿数组的第一个数字作为基数,从右至左找出比基数大于等于的数字,放到基数的左侧。再从左至右找到比基数小的数字,放到基数的右侧。

2、然后以基数为中心点,再将基数左侧进行一下1中的排序。  再将基数右侧进行一下1中的排序。 如何递归,最终得出排序结果

3、有一点要说明的,按那位大神的解释,按基数进行数字交换时,使用的是挖坑法进行交换的,例如:

1)、我们有数组int[] arrayData = { 5, 9, 6, 7, 4, 1, 2, 3, 8 };

2)、第一轮中,我们以5为基数进行左右排序, 这时5的索引0就是第一个坑。我们需要找到数字往坑填数。

3)、先从右向左查找。   OK,我们找到3,也就是索引7。 我们先把3写到arrayData[0]中(2中挖好的坑哟)。 然后arrayData[7]就是待填的坑了

4)、再从左向右查找,这时的开始查找索引是arrayData[1]。 往右找比5小的,我们发现是4, 然后将4放到arrayData[7]中(3挖好的坑)。 然后arrayData[4]就是待填的坑了(arrayData[4]就是数字4的索引)

5)、接着从右向左查找。 开始索引是6。。。然后就是填坑,挖坑,左向右查找。。。以此类推

6)、最终i==j时,就跳出循环啦

代码

使用的是java

/** 快速排序*/
public class QuickSort {public static void main(String[] args) {int[] arrayData = { 5, 9, 6, 7, 4, 1, 2, 3, 8 };QuickSortMethod(arrayData);for (int integer : arrayData) {System.out.print(integer);System.out.print(" ");}}public static void QuickSortMethod(int[] arrayData) {Sort(arrayData, 0, arrayData.length - 1);}public static void Sort(int[] arrayData, int beginIndex, int endIndex) {if (beginIndex < endIndex) {int i = Adjust(arrayData, beginIndex, endIndex);Sort(arrayData, beginIndex, i - 1);Sort(arrayData, i + 1, endIndex);}}// 返回最终排序后基数的位置public static int Adjust(int[] arrayData, int beginIndex, int endIndex) {int i = beginIndex;int j = endIndex;int temp = arrayData[i]; // 基数while (i < j) {// 先从右向左找,找比temp大的数字while (i < j && arrayData[j] <= temp) {j--;}if (i < j) {arrayData[i] = arrayData[j]; // 找到右侧比temp基数大的数字后,放到左侧索引中i++; // 左侧索引加1,开始向右侧寻找比temp基数小的数字}while (i < j && arrayData[i] > temp) { // 向右寻找比temp基数小的数字i++;}if (i < j) {arrayData[j] = arrayData[i];j--;}}arrayData[i] = temp;return i;}
}

最终结果

9 8 7 6 5 4 3 2 1

算法复杂度:O(nlog2n)

空间复杂度:O(log2n)

  

参考

http://blog.csdn.net/morewindows/article/details/6684558

转载于:https://www.cnblogs.com/hark0623/p/4343464.html

Hark的数据结构与算法练习之快速排序相关推荐

  1. 数据结构与算法-day3-归并 快速排序

    我的理解 上一节的末尾我说了,冒泡 插入 选择这三种时间复杂度都是O(n2),只适用于小规模排序,那么,相对常用的适用于大规模的排序又是哪些呢? 归并排序和快速排序都用到了分治思想,且代码通过递归来解 ...

  2. Hark的数据结构与算法练习之珠排序

    ---恢复内容开始--- 算法说明 珠排序是分布排序的一种. 说实在的,这个排序看起来特别的巧妙,同时也特别好理解,不过不太容易写成代码,哈哈. 这里其实分析的特别好了,我就不画蛇添足啦.  大家看一 ...

  3. Hark的数据结构与算法练习之锦标赛排序

    算法说明 锦标赛排序是选择排序的一种. 实际上堆排序是锦标赛排序的优化版本,它们时间复杂度都是O(nlog2n),不同之处是堆排序的空间复杂度(O(1))远远低于锦标赛的空间复杂度(O(2n-1)) ...

  4. Hark的数据结构与算法练习之圈排序

    算法说明 圈排序是选择排序的一种.其实感觉和快排有一点点像,但根本不同之处就是丫的移动的是当前数字,而不像快排一样移动的是其它数字.根据比较移动到不需要移动时,就代表一圈结束.最终要进行n-1圈的比较 ...

  5. Hark的数据结构与算法练习之若领图排序ProxymapSort

    算法说明 若领图排序是分布排序的一种. 个人理解,若领图排序算是桶排序+计数排序的变异版,桶排序计数排序理解了,那么若领图排序理解起来就会比较容易.区别其实就是存储中间值的方式做了调整-- 话说,这个 ...

  6. Hark的数据结构与算法练习之基数排序

    算法说明 基数排序是基于计数排序的,所以看这个之前要先看一下计数排序对于理解基数排序是很有帮助的(发现计数和基数的音节几乎一致啊).这个我有写,请点击. OK,现在你肯定已经熟悉了计数排序,那么我就来 ...

  7. Hark的数据结构与算法练习之图书馆排序

    算法说明 图书馆排序是插入排序的变种,典型的以空间换时间的一种方法.我个人感觉这种思路可以学习借鉴,但直接使用的场景应该不大. 我们知道,真正的插入排序通常往前边插入元素后,我们要把后边所有的元素后移 ...

  8. Hark的数据结构与算法练习之希尔排序

    算法说明 希尔排序是插入排序的优化版. 插入排序的最坏时间复杂度是O(n2),但如果要排序的数组是一个几乎有序的数列,那么会降低有效的减低时间复杂度. 希尔排序的目的就是通过一个increment(增 ...

  9. Hark的数据结构与算法练习之冒泡排序

    算法说明: 冒泡排序实际上是使用的最多的排序,逻辑是循环然后对相邻的数字进行比较,并交换数据. 例如有一个数组int[] arrayData = { 2, 3, 1, 5, 6, 7, 4, 65, ...

最新文章

  1. LSM Tree 学习笔记——MemTable通常用 SkipList 来实现
  2. 从零开始学习OpenGL ES之五 – 材质
  3. poi excel设置合并单元格边框格式
  4. c语言 sizeof_c语言详解sizeof
  5. 进程线程协程-基本概念及特点
  6. Comcast Xfinity家庭安全系统被曝严重漏洞
  7. 完成端口与高性能服务器程序开发
  8. 实现UncaughtExceptionHandler来实现获取应用全局的crash信息
  9. 5个实用的Excel小技巧,谁用谁说好 !
  10. 2022年四川省职业院校技能大赛(中职组)网络安全赛项规程
  11. gggggggggggg
  12. Ubuntu安装微软Onedrive教程
  13. Java曲线之削峰填谷,科学网—Lorenz曲线之削峰填谷 - 李宁的博文
  14. python获取元素在数组中的位置
  15. 资深程序员雷总对代码的执念
  16. 学校教务管理系统(第二弹
  17. xshell 免费版本下载
  18. 程序员 必知 的 自学网站,建议收藏!
  19. MATLAB中物体夹角的检测
  20. 在学RTX之前的操作系统知识

热门文章

  1. 朱松纯团队工作登上 Science 头条—AI“读懂”人类价值观
  2. 可扩展性设计之数据切分
  3. a豆的使命:每一位年轻人都值得珍重
  4. Windows下利用Chrome调试IOS设备页面
  5. 调用微信扫码实现扫一扫签到
  6. SEO简单优化使用百度主动提交原创文章来达到秒收录
  7. 时间格式转换,转时间戳,转UTC,转中国标准时间
  8. 内存数据网格IMDG简介
  9. 路由器pppoe服务器无响应,宽带拨号服务器无响应
  10. BTC地址不同格式的区别