Java排序算法(七):希尔排序(Shell排序)
2015-03-23 18:39
387 查看
Java排序算法(七):希尔排序(Shell排序)
希尔排序(缩小增量法) 属于插入类排序,由Shell提出,希尔排序对直接插入排序进行了简单的改进:它通过加大插入排序中元素之间的间隔,并在这些有间隔的元素中进行插入排序,从而使数据项大跨度地移动,当这些数据项排过一趟序之后,希尔排序算法减小数据项的间隔再进行排序,依次进行下去,进行这些排序时的数据项之间的间隔被称为增量,习惯上用字母h来表示这个增量。
常用的h序列由Knuth提出,该序列从1开始,通过如下公式产生:
h = 3 * h +1
反过来程序需要反向计算h序列,应该使用
h=(h-1)/3
代码实现:
[java] view
plaincopyprint?
package sort;
public class ShellSortTest {
public static int count = 0;
public static void main(String[] args) {
int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };
print(data);
shellSort(data);
print(data);
}
public static void shellSort(int[] data) {
// 计算出最大的h值
int h = 1;
while (h <= data.length / 3) {
h = h * 3 + 1;
}
while (h > 0) {
for (int i = h; i < data.length; i += h) {
if (data[i] < data[i - h]) {
int tmp = data[i];
int j = i - h;
while (j >= 0 && data[j] > tmp) {
data[j + h] = data[j];
j -= h;
}
data[j + h] = tmp;
print(data);
}
}
// 计算出下一个h值
h = (h - 1) / 3;
}
}
public static void print(int[] data) {
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + "\t");
}
System.out.println();
}
}
运行结果:
[java] view
plaincopyprint?
5 3 6 2 1 9 4 8 7
1 3 6 2 5 9 4 8 7
1 2 3 6 5 9 4 8 7
1 2 3 5 6 9 4 8 7
1 2 3 4 5 6 9 8 7
1 2 3 4 5 6 8 9 7
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
上面程序在和直接插入法比较,会发现其与直接插入排序的差别在于:直接插入排序中的h会以1代替
Shell排序是不稳定的,它的空间开销也是O(1),时间开销估计在O(N3/2)~O(N7/6)之间
希尔排序(缩小增量法) 属于插入类排序,由Shell提出,希尔排序对直接插入排序进行了简单的改进:它通过加大插入排序中元素之间的间隔,并在这些有间隔的元素中进行插入排序,从而使数据项大跨度地移动,当这些数据项排过一趟序之后,希尔排序算法减小数据项的间隔再进行排序,依次进行下去,进行这些排序时的数据项之间的间隔被称为增量,习惯上用字母h来表示这个增量。
常用的h序列由Knuth提出,该序列从1开始,通过如下公式产生:
h = 3 * h +1
反过来程序需要反向计算h序列,应该使用
h=(h-1)/3
代码实现:
[java] view
plaincopyprint?
package sort;
public class ShellSortTest {
public static int count = 0;
public static void main(String[] args) {
int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };
print(data);
shellSort(data);
print(data);
}
public static void shellSort(int[] data) {
// 计算出最大的h值
int h = 1;
while (h <= data.length / 3) {
h = h * 3 + 1;
}
while (h > 0) {
for (int i = h; i < data.length; i += h) {
if (data[i] < data[i - h]) {
int tmp = data[i];
int j = i - h;
while (j >= 0 && data[j] > tmp) {
data[j + h] = data[j];
j -= h;
}
data[j + h] = tmp;
print(data);
}
}
// 计算出下一个h值
h = (h - 1) / 3;
}
}
public static void print(int[] data) {
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + "\t");
}
System.out.println();
}
}
运行结果:
[java] view
plaincopyprint?
5 3 6 2 1 9 4 8 7
1 3 6 2 5 9 4 8 7
1 2 3 6 5 9 4 8 7
1 2 3 5 6 9 4 8 7
1 2 3 4 5 6 9 8 7
1 2 3 4 5 6 8 9 7
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
上面程序在和直接插入法比较,会发现其与直接插入排序的差别在于:直接插入排序中的h会以1代替
Shell排序是不稳定的,它的空间开销也是O(1),时间开销估计在O(N3/2)~O(N7/6)之间
相关文章推荐
- Java排序算法(八):希尔排序(Shell排序)
- Java排序算法(八):希尔排序(Shell排序)
- [学习笔记]Java排序算法:希尔排序(Shell排序)
- Java排序算法:希尔排序(Shell排序)
- Java排序算法总结之希尔排序
- 排序算法之希尔排序(JAVA)
- 排序算法(二)_希尔排序、快速排序、归并排序的Java实现
- Java排序算法4:希尔排序
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 排序算法--希尔排序(JAVA)
- 排序算法Java实现(希尔排序)
- 【排序算法】希尔排序(java实现)
- 排序算法系列七(希尔排序也称shell排序)
- 排序算法之希尔排序(java实现)
- 初级排序算法之冒泡、选择、插入、希尔排序(附Java实现和分析)
- 排序算法之希尔排序Java版
- 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序
- 排序算法--插入排序(直接插入排序、折半插入、shell排序)的java实现
- 排序算法(Java实现):Shell排序和归并排序
- java 排序算法实现 其五:希尔排序