您的位置:首页 > 编程语言 > Java开发

算法是个什么玩意儿-希尔排序

2015-03-24 13:52 169 查看
我想希尔排序 应该算 插入排序的一个优化。把一个数组按规则分割成若干个子序列,
然后没子序列进行直接插入排序。然后缩小增量,对之前有过一次排序的数组,再分割,再进行插入排序,最后增量为1,数组基本有序了,执行最后一次 直接插入排序。

下边是我从其他人的博客抄的一段话,希望对大家理解起来有所帮助。
希尔排序的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。

下边是我做的测试类,一个数组是 49, 38, 65, 97, 26, 13, 27, 49, 55, 4,11。
第一趟按照 增量为5 进行分割子序列(5组),每组的下标是0 5 10; 1 6 ; 2 7 ; 3 8 ;4 9
然后对每组进行直接插入排序。
第二趟按照 增量为2,分割成两组 。
第三趟按照增量为1 ,也就是只分割成了1组 ,直接插入排序。
import java.util.Arrays;
public class Array {
// 把11个数的数组,分成三组
static void group(){
//0 5 10; 1 6 ; 2 7 ; 3 8 ;4 9
int [] ia = {49, 38, 65, 97, 26, 13, 27, 49, 55, 4,11};
// 把数组分成三组
int gap = ia.length/2;
int count = 0;
while(count<gap){
int i  = count;
while(i<ia.length){
System.out.println(ia[i]);
i = i+gap;
}
count++;
}
}
// 希尔排序
static void shellSort(){
int [] ia = {49, 38, 65, 97, 26, 13, 27, 49, 55, 4,11};
System.out.println("原始数据:"+ Arrays.toString(ia));
// 把数组分成三组
int gap = ia.length/2;
// 0 5 10; 1 6 ; 2 7 ; 3 8 ;4 9
int count = 0;
while (gap>=1) {
while(count<gap) {
int original =  count+gap; // 表示从每组的哪个下标开始进行插入排序 ,即从每组第二个下标开始的 5,6,7,8,8,9开始进行插入排序
while(original<ia.length) {
int current = original; // current 当前要 进行插入排序的元素的下标
int previous  = original-gap;

while(previous>=0 && (ia[previous]>ia[current])) {
//  if() {
int temp ;
temp = ia[previous];
ia[previous] = ia[current] ;
ia[current] = temp;

current = current-gap;
previous = previous-gap;

// }
}
original = original+gap;
} //original<ia.length while end
count++;
}
System.out.println(Arrays.toString(ia)); //打印每趟循环后的元素变化
gap = gap/2;
count = 0;
}
System.out.println("排好序的数据"+Arrays.toString(ia));
}

/**
* @param args
*/
public static void main(String[] args) {
shellSort();
}
有不明白大家提出问题,别忘记点赞 谢谢支持

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息