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

算法--排序--希尔

2016-12-15 00:14 176 查看
希尔是插入排序的姊妹,她在插入的基础上引入了分组的概念,在分组内做插入,然后不断地缩小分组的个数,分组为0即可完成排序。换句话,插入排序是分组为1的希尔排序。

举个例子:现有长度为10的数组[1, 5, 8, 4, 7, 3, 0, 2, 9, 6];



注:希尔排序的整个过程,图中颜色相同的表示处于同一个分组内,元素所处的位置对应着数组的下标。

(1)既然引入了分组gap,不妨就让gap = 10/2(当然这个长度你可以随便设,只是分组越小,小组内插入的效率就越高);也就是分成了5组,如图示。

(2)继续缩小gap,重复小组内的插入排序。gap = 5/2,分成2组,如图示。

(3)重复(2),gap = 2/2;此时相当于普通的插入排序,前面已经说过,插入排序在数据较少且基本有序的状态下,效率是最高的。而此时整体大部分数据处于有序状态,所以很高效。

(4)重复(2),gap = 0;完成排序。

条件:

数据量较小

原理:

(1)选出第一个gap,各个gap内插入;

(2)缩小gap,重复(1);

….

(n)gap为0,打完收工。

时间复杂度:

最优(n)和最差(n^2),平均nlog(n)。记住nlog(n)就行了。

笔面试出现的频率:

除了在线笔试偶尔会考到时间复杂度,面试和现场笔试从来没有考过。

实现:

为了方便记忆,这里写的尽量和插入排序类似,需要的话可以对比着来记。

public class SheSort {

/**
* <p>name: main</p>
* <p>description: </p>
* <p>return: void</p>
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array = { 1, 5, 8, 4, 7, 3, 0, 2, 9, 6, 11, 13, 12, 141, 14, 15,
17, 16, 18, 21, 20, 19, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
33, 34, 35, 36, 40, 39, 38, 37 };
sheSort(array);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + ", ");
}
}

public static void sheSort(int[] array) {
int gap = array.length / 5;
while (gap > 0) {
for (int i = gap; i < array.length; i += gap) {
if (array[i] < array[i - gap]) {
int temp = array[i];
int j = i - gap;
while (j >= 0 && array[j] > temp) {
array[j + gap] = array[j];
j -= gap;
}
/** 容易出错 */
array[j + gap] = temp;
}
}
gap = gap >> 1;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息