算法是个什么玩意儿-希尔排序
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组 ,直接插入排序。
然后没子序列进行直接插入排序。然后缩小增量,对之前有过一次排序的数组,再分割,再进行插入排序,最后增量为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(); }有不明白大家提出问题,别忘记点赞 谢谢支持
相关文章推荐
- 算法是个什么玩意儿-插入排序
- 算法是个什么玩意儿-桶排序和鸽巢排序
- 什么是算法?
- 有趣的算法世界---什么是算法
- 希尔排序(shellsort)算法实现
- 软件开发者面试百问-----不管是书、杂志还是网络,你从中所学到的最后一点算法知识是什么?
- 软件开发者面试百问-----你愿意用什么类型的语言来编写复杂的算法?
- SPF 和 DUAL 两种算法有什么区别?
- 希尔排序(shellsort)算法实现
- 像那些付费软件的注册算法一般是用什么算法?
- 公钥和私钥加密主要算法有哪些,其基本思想是什么
- 这个是什么算法?
- 数据库中取出数据用什么算法遍历它的子节点
- 数据结构及算法-算法是什么?
- 什么玩意儿
- 什么是算法
- 编程什么是算法?
- 而今迈步重头越-复习基本算法 之 希尔排序
- Pythonic到底是什么玩意儿?
- 什么是LRU算法?