您的位置:首页 > 理论基础 > 数据结构算法

《数据结构和Java集合框架第三版》读书笔记(十二)快速排序

2014-02-11 17:11 218 查看
快速排序符合分治法。

分解:选择 枢轴,将数组划分成两个子数组,左子数组的每个元素都小于或等于 枢轴元素,右子数组的每个元素都大于或等于 枢轴元素,左子数组的每个元素都小于右子数组。

解决:通过递归调用快速排序分别对两个子数组进行排序。

合并:由于快速排序是就地排序,不需合并,快速排序进行完后整个数组就已经排序完毕。

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: