《数据结构和Java集合框架第三版》读书笔记(十二)快速排序
2014-02-11 17:11
218 查看
快速排序符合分治法。
分解:选择 枢轴,将数组划分成两个子数组,左子数组的每个元素都小于或等于 枢轴元素,右子数组的每个元素都大于或等于 枢轴元素,左子数组的每个元素都小于右子数组。
解决:通过递归调用快速排序分别对两个子数组进行排序。
合并:由于快速排序是就地排序,不需合并,快速排序进行完后整个数组就已经排序完毕。
private static void sort1(int x[ ], int off, int len)
对x数组从索引off开始的len个元素进行快速排序。
先找到 枢轴元素:
将所有小于枢轴元素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。
对这时的两个子数组如sort1方法进行快速排序
快排的平均时间是O(NlogN),最差时间是O(N^2)
分解:选择 枢轴,将数组划分成两个子数组,左子数组的每个元素都小于或等于 枢轴元素,右子数组的每个元素都大于或等于 枢轴元素,左子数组的每个元素都小于右子数组。
解决:通过递归调用快速排序分别对两个子数组进行排序。
合并:由于快速排序是就地排序,不需合并,快速排序进行完后整个数组就已经排序完毕。
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减,继续执行外层循环 }
对这时的两个子数组如sort1方法进行快速排序
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)
相关文章推荐
- 读书笔记--快速排序
- 《算法导论》读书笔记之第7章 快速排序
- 《啊哈!算法》读书笔记--排序(快速排序,冒泡排序)
- 《算法导论》读书笔记之第7章 快速排序
- 读书笔记之快速排序
- 读书笔记 算法导论 快速排序 QuickSort 使用最后一个元素作为pivot
- 《大话数据结构》读书笔记之快速排序源码及其优化
- 快速排序
- 快速排序的C++与R语言实现
- 05快速排序
- PAT乙级练习题B1045. 快速排序
- 快速排序C实现
- 算法学习 - 快速排序相关
- 快速排序
- 白话经典算法系列之六 快速排序 快速搞定
- 直接查找排序,归并排序,快速排序,计数排序 ,堆排 C++实现
- 快速排序
- 快速排序
- poj 2388 Who's in the Middle(快速排序求中位数)
- 面试题:冒泡排序,选择排序,插入排序,快速排序,归并排序,堆排序