文档介绍:精选公文范文
排序归并、快排、优 先队列等
各位读友大家好,此文档由网络收集而来,欢迎您下载,谢谢
思想:首先,找到数组中最小的那 个元素。其次,将它和数组的第一个元 素交换位置。再次,在剩下的元素中找 到最小的元素,将它与数组的第出空 间,它们可能会被移动。但是当索引到 达数组的右端时,数组排序就完成了。 插入排序不会访问索引右侧的元素,而 选择排序不会访问索引左侧的元素。
和选择排序不同的是,插入排序所 需的时间取决于输入中元素的初始顺 序。对一个其中的元素已经有序(或接近 有序)的数组进行排序,将会比对随机顺 序的数组或是逆序数组进行排序要快得 多。
【图例】
使用插入排序为一列数字进行排序 的过程。
从前到后逐步有序。
void%20sort(Comparable%20a){%20%20 %20%20//将 a 按升序排 列 %20%20%20%20int%20N%20=%%20; %20%20%20%20for%20(int%20i%20=% 201;%20i%20=1%20&&%20less(a,%20a) ;%20j--)%20%20%20%20%20%20%20%
精选公文范文 6
精选公文范文
20%20%20%20%20exch(a,%20j,%20j-1) %20;%20%20%20%20}}
〃在索引i由左向右变化的过程中, 它左侧的元素总是有序的,所以当i到达 数组的右端时排序就完成了。
改进:要大幅提高插入排序的速度 并不难,只需要在内循环中将较大的元 素都向右移动而不总是交换两个元素。
【平均情况下插入排序需要~N2/4 次比较以及~N2/4次交换。】
【当倒置(两元素颠倒)的数量很少 时,插入排序很可能比其他任何排序算 法都要快!】
【插入排序对于部分有序的数组十 分高效,也很适合小规模数组。它也是 高级排序算法的中间过程。】
【插曲】
Knuth高爷爷说:“尽管第一个二分 查找程序于1946年就已经公布了,但是 第一个没有bug的二分查找程序在1962 年才出现。”
显然,我们上面的二分查找代码是 精选公文范文 7
精选公文范文
有 bug 的。%20
至于二分查找,以后会再起一篇博 文详细讨论。
希尔排序,也称递减增量排序算法, 是插入排序的一种更高效的改进版本。
希尔排序是基于插入排序的以下两 点性质而提出改进方法的:
1、 插入排序在对几乎已经排好序的 数据操作时,效率高,%20即可以达到 线性排序的效率
2、 对于大规模乱序数组插入排序很 慢,因为它只会交换相邻的元素,因此 元素只能一点一点地从数组的一端移动 到另一端。
希尔排序简单地改进了插入排序, 交换不相邻的元素以对数组的局部进行 排序,并最终用插入排序将局部有序的 数组排序。
思想:使数组中任意间隔为h的元 素都是有序的。这样的数组被称为h有 序数组。在进行排序时,如果h很大, 我们就能将元素移动到很远的地方,为 精选公文范文 8
精选公文范文
实现更小的h有序创造方便。
我们只需要在插入排序的代码中将 移动元素的距离改为h即可。这样,希 尔排序的实现就转化为了一个类似于插 入排序但使用不同增量的过程。
【图例】
void%20sort(Comparable%20a){%20%20 %20%20//将 a 按升序排 列 %20%20%20%20int%20N%20=%%20; %20%20%20%20int%20h%20=%201%20 ;%20%20%20%20%20%20%20%20// 根 据数组长度%20选取适当的初始间隔 h%20%20%20%20while%20(h%20=%20 1)%20%20%20%20{%20%20%20%20% 20%20%20%20//将数组变为 h 有 序 %20%20%20%20%20%20%20%20for %20(int%20i%20=%20h;%20i%20=h%20 &&%20less(a,%20a);%20j-=h)%20%20% 20%20%20%20%20%20%20%20%20%2 0%20%20%20%20exch(a,%20j,%20j-h)% 20;%20%20%20%20%20%20%20%20}% 精选公文范文 9
精选公文范文 20%20%20%20%20%20%20%20h%20= %20h/3%20;%20%20%20%20}}
希尔排序更高效的原因是它权衡了 子数组的规模和有序性。排序之初,各 个子数组都很短,排序之后子数组都是 部分有序的,这两种情况都很适合插入 排序。
希尔排序的算法性能不仅取决于h, 还取决于h之间的数学性质。在实际应 用中,使用