《数据结构和Java集合框架第三版》读书笔记(十二)快速排序
来源:互联网 发布:tizen软件下载 编辑:程序博客网 时间:2024/05/18 03:12
快速排序符合分治法。
分解:选择 枢轴,将数组划分成两个子数组,左子数组的每个元素都小于或等于 枢轴元素,右子数组的每个元素都大于或等于 枢轴元素,左子数组的每个元素都小于右子数组。
解决:通过递归调用快速排序分别对两个子数组进行排序。
合并:由于快速排序是就地排序,不需合并,快速排序进行完后整个数组就已经排序完毕。
private static void sort1(int x[ ], int off, int len)
对x数组从索引off开始的len个元素进行快速排序。
先找到 枢轴元素:
int m = off + (len >> 1),l = off,n = off + len - 1;m = med3 (x, l, m, n); //3个元素的 中值int v = x [m]; // v是枢轴如给定数组 59 46 32 80 46 55 50 43 44 81 12 95 17 80 75 33 40 61 16 87 枢轴元素v=59
将所有小于枢轴元素v的元素移动到左子数组,将所有大于枢轴元素v的元素移到右子数组。值为v的元素可以放在任意一个子数组,两个子数组的长度并不要求一样。
采用指针b和c,创建一个循环,循环内b从off往右计数,c从off+len-1向左计数,b>c时break。这个循环包括两个内循环,第一个内循环里b不断向自增,直到x[b]>v;第二个内循环里c不断减小,直到x[c]<v。两个内循环终止后,交换x[b]和x[c],然后b增c减,继续执行外层循环,直到b>c时break。
while(true){while(b<=c&&x[b]<v)b++;while(b<=c&&x[c]>v)c--;if(b>c)break;swap (x, b++, c--);//交换x[b]和x[c],然后b增c减,继续执行外层循环}
if(c+1–off>1) sort1 (x, off, c + 1 –off);if(off + len –b > 1) sort1 (x, b, off + len -b);
快排的平均时间是O(NlogN),最差时间是O(N^2)
public static int[] quickSort(int[] array){ if (array == null || array.length == 0) return array; quickSortCore(array,0,array.length-1); return array; } private static void quickSortCore(int[] array, int start, int end) { //找到枢轴元素 int pivot=getPivot(array,start,end); int left=start; int right=end; //将左右两个指针向枢轴移动 // 直到左指针超过右指针或者左边元素不小于枢轴元素的时候左指针停止移动,直到左指针超过右指针或者右边元素不大于枢轴元素的时候右指针停止移动 //如果都停止移动时,交换左右元素 // 然后指针都向枢轴移动一步,然后继续上述循环 //直到左指针移动到右指针右边为止 while (left<=right){ while (left<=right&&array[left]<pivot){ left++; } while (left<=right&&array[right]>pivot){ right--; } if (left<=right) swap(array,left++,right--); } if (start<right) quickSortCore(array,start,right); if (left<end) quickSortCore(array,left,end); } /** * 获取数组的枢轴元素 */ private static int getPivot(int[] array, int start, int end) { int midIndex=(start+end)>>>1; int min,max; if (array[start]<array[midIndex]){ min=array[start]; max=array[midIndex]; }else { min=array[midIndex]; max=array[start]; } return array[end]<min?min:(array[end]<max?array[end]:max); } private static void swap(int[] array, int j, int i) { if (i==j) return; int k = array[i]; array[i] = array[j]; array[j] = k; }
0 0
- 《数据结构和Java集合框架第三版》读书笔记(十二)快速排序
- 《数据结构和Java集合框架第三版》读书笔记(十)简单排序
- 《数据结构和Java集合框架第三版》读书笔记(十一)归并排序
- 《数据结构和Java集合框架第三版》读书笔记(零)——数组、类、集合
- 《数据结构和Java集合框架第三版》读书笔记(二)——二分法检索
- 《数据结构和Java集合框架第三版》读书笔记(三)回溯算法
- 《数据结构和Java集合框架第三版》读书笔记(一)递归
- 《数据结构和Java集合框架第三版》读书笔记(六)LinkedList双向链表
- 《数据结构和Java集合框架第三版》读书笔记(七)二叉树
- 《数据结构和Java集合框架第三版》读书笔记(八)二叉搜索树
- 《数据结构和Java集合框架第三版》读书笔记(九)平衡二叉搜索树的旋转
- 《数据结构和Java集合框架第三版》读书笔记(五)浅复制(shallow copy)和深复制
- 数据结构(JAVA语言描述第三版)读书笔记
- (十二)数据结构之快速排序算法实现
- java数据结构和算法-3,快速排序
- 集合框架和数据结构
- Java集合框架和数组的排序
- 【java数据结构】快速排序
- synchronized详解(一)
- A+B for Input-Output Practice 2
- C# 加密小工具代码实现
- 第3周 分布式文件系统HDFS原理与操作
- PF_RING实现分析
- 《数据结构和Java集合框架第三版》读书笔记(十二)快速排序
- bzoj1660栈
- Qt实现屏保功能,鼠标一定时间无响应程序进入待机状态
- BLOCK方式实现OC程序中多个页面判定用户是否登录
- 定义跨平台的数据类型
- C#网络编程(异步传输字符串) - Part.3
- synchronized详解(二)
- Android高效加载大图、多图解决方案,有效避免程序OOM
- find the nth digit(数论)