基础算法系列(十八)排序算法之快速排序
来源:互联网 发布:mac给iphone刷机 编辑:程序博客网 时间:2024/05/16 16:18
快速排序:(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都
要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数
据变成有序序列。
根据概念可以看出来,我们需要一个中间值来讲数组分为两部分,中间值的选取还是要选好的。
上代码
/** * 快速排序升序 */public static void sort_kuaishu_asc(int[] array, int start, int end) {int length = end - start + 1;if (length < 2)return;else if (length == 2) {if (array[start] > array[end]) {int temp = array[end];array[end] = array[start];array[start] = temp;return;}} else {// 得出最大值和最小值int min = array[start], max = array[start];for (int i = start; i < start + length; i++) {if (array[i] < min)min = array[i];if (array[i] > max)max = array[i];}// 找出合适的中间数(按中间值找,最好是像计数排序一样先统计比元素小的个数,然后按照个数确定哪个做中间数)int absMid = (min + max) / 2;int offset = Math.abs(array[start] - absMid);int relativeMid = array[start];int midIndex = start;for (int i = start; i < start + length; i++)if (Math.abs(array[i] - absMid) < offset) {offset = Math.abs(array[i] - absMid);relativeMid = array[i];}int[] newArray = new int[length];for (int i = 0; i < newArray.length; i++)newArray[i] = -1;for (int i = start, startIndex = 0, endIndex = length - 1; i < start+ length; i++) {if (array[i] < relativeMid) {newArray[startIndex] = array[i];startIndex++;} else if (array[i] > relativeMid) {newArray[endIndex] = array[i];endIndex--;}}for (int i = 0; i < newArray.length; i++)if (newArray[i] == -1)newArray[i] = relativeMid;for (int i = start, newIndex = 0; i < start + length; i++, newIndex++) {array[i] = newArray[newIndex];if (array[i] == relativeMid)midIndex = i;}sort_kuaishu_asc(array, start, midIndex - 1);sort_kuaishu_asc(array, midIndex + 1, length - 1 + start);}}
/** * 快速排序降序 */public static void sort_kuaishu_dasc(int[] array, int start, int end) {int length = end - start + 1;if (length < 2)return;else if (length == 2) {if (array[start] < array[end]) {int temp = array[end];array[end] = array[start];array[start] = temp;return;}} else {// 得出最大值和最小值int min = array[start], max = array[start];for (int i = start; i < start + length; i++) {if (array[i] < min)min = array[i];if (array[i] > max)max = array[i];}// 找出合适的中间数(按中间值找,最好是像计数排序一样先统计比元素小的个数,然后按照个数确定哪个做中间数int absMid = (min + max) / 2;int offset = Math.abs(array[start] - absMid);int relativeMid = array[start];int midIndex = start;for (int i = start; i < start + length; i++)if (Math.abs(array[i] - absMid) < offset) {offset = Math.abs(array[i] - absMid);relativeMid = array[i];}int[] newArray = new int[length];for (int i = 0; i < newArray.length; i++)newArray[i] = -1;for (int i = start, startIndex = 0, endIndex = length - 1; i < start+ length; i++) {if (array[i] > relativeMid) {newArray[startIndex] = array[i];startIndex++;} else if (array[i] < relativeMid) {newArray[endIndex] = array[i];endIndex--;}}for (int i = 0; i < newArray.length; i++)if (newArray[i] == -1)newArray[i] = relativeMid;for (int i = start, newIndex = 0; i < start + length; i++, newIndex++) {array[i] = newArray[newIndex];if (array[i] == relativeMid)midIndex = i;}sort_kuaishu_dasc(array, start, midIndex - 1);sort_kuaishu_dasc(array, midIndex + 1, length - 1 + start);}}
调用代码
SortUtil.sort_kuaishu_asc(array, 0, array.length - 1);SortUtil.sort_kuaishu_dasc(array, 0, array.length - 1);
0 0
- 基础算法系列(十八)排序算法之快速排序
- 【基础算法】排序-复杂排序之二(快速排序)
- 七大排序算法系列之快速排序
- 排序算法系列二之快速排序
- 排序算法系列-交换之快速排序
- 基础算法系列(五)排序算法之冒泡排序
- 基础算法系列(六)排序算法之鸡尾酒排序
- 基础算法系列(七)排序算法之插入排序
- 基础算法系列(八)排序算法之桶排序
- 基础算法系列(九)排序算法之计数排序
- 基础算法系列(十)排序算法之合并排序
- 基础算法系列(十三)排序算法之地精排序
- 基础算法系列(十四)排序算法之图书馆排序
- 基础算法系列(十五)排序算法之选择排序
- 基础算法系列(十六)排序算法之希尔排序
- 基础算法系列(十七)排序算法之堆排序
- 基础算法系列(十九)排序算法之内省排序
- 算法基础之排序篇-快速排序
- 2014年度总结
- 如何选择delegate、notification、KVO?
- python和java生成随即序列
- 【位操作】通过位操作快速实现某些计算结果
- 异常常见类型处理分析
- 基础算法系列(十八)排序算法之快速排序
- cherrypy和tornado性能分析
- 判断输入框
- 从 C/C++ 程序调用 Java 代码 (不是用JNI)
- Skidmarks
- 在framework中打包xib
- 使用Modernizr探测HTML5/CSS3新特性
- iOS 默认某个cell为选中状态
- Oracle Merge into 用法详解