排序7:希尔排序
http://blog.csdn.net/qq_27703417/article/details/70952849
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

import java.util.*;
//希尔排序,对步长feet进行循环或者递归地缩短,直到收敛为步长为1的直接插入排序
public class ShellSort{
public int[] shellSort(int[] A, int n) {
// 特殊输入
if (A == null || A.length <= 0)
return A;
// 调用递归方法(尾递归)sort()来完成希尔排序
//注意习惯,题目中的数组通常以A给出,而自己喜欢用array表示数组,因此在调用函数时要记住传入的是A
sort(A, A.length >> 1);
// 记得要返回排序后的结果
return A;
}
// 写一个排序方法sort(array,feet)用来使用步长feet对数组进行插入排序,内部调用的方法最好写成private方法
private void sort(int[] array, int feet) {
// 递归一定要有停止递归的边间条件
if (feet <= 0)
return;
// 按照步长feet对数组array进行插入排序
// 初始位置为i=feet;初始的比较位置是index=index-feet
for (int i = feet; i < array.length; i++) {
// 要与前一个元素进行比较需要设置一个指针index,总是比较2个相邻的元素array[index]和array[index-feet],第一个元素是array[i]
int index = i;
// 如果index-feet<0说明index不要再往前交换了,本元素已经找到了合适的位置,停止循环
while (index - feet >= 0) {
if (array[index] < array[index - feet]) {
// 如果后一个元素比前一个元素要小,应该交换元素
this.swap(array, index, index - feet);
index -= feet;
} else {
// 注意,还要有else,如果后面的元素大于等于前面的元素,不需要交换,说明元素array[index]之前已经找到合适的位置于是不需要再往前遍历了,结束本元素array[i]的插入,开始下一个i的向前插入
break;
}
}
}
// 本步长的插入结束,此时需要更换步长feet,再次进行插入,于是递归调用sort()传入新的步长即可
this.sort(array, feet >> 1);
}
// 写一个辅助函数用来交换2个元素
private void swap(int[] array, int p1, int p2) {
int temp = array[p1];
array[p1] = array[p2];
array[p2] = temp;
}
}
posted on 2017-08-22 16:19 zhangxiaoyu 阅读(158) 评论(0) 收藏 举报
浙公网安备 33010602011771号