转载声明:文章来源https://blog.csdn.net/qq_56127002/article/details/126414650
目录
一:希尔排序思想
二:希尔排序比插入排序的好处
三:希尔排序代码
四:结果
一:希尔排序思想
基本思想:希尔排序是把序列按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量的逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个序列恰好被分为一组,算法便终止。
算法实现:希尔排序需要定义一个增量,这里选择增量为gap=length/2,缩小增量以gap=gap/2的方式,这个增量可以用一个序列来表示,{n/2,(n/2)/2…1},称为增量序列,这个增量是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。
(1)对于一个无序序列{8,9,1,7,2,3,5,4,6,0}来说,我们初始增量为gap=length/2=5,所以这个序列要被分为5组,分别是{8,3},{9,5},{1,4},{7,6},{2,0},对这5组分别进行直接插入排序,则小的元素就被调换到了前面,然后再缩小增量gap=gap/2=2。
(2)上面缩小完增量后,序列再次被分为2组,分别是{3,1,0,9,7}和{5,6,8,4,2},再对这两组进行直接插入排序,那么序列就更加有序了。
(3)然后再缩小增量gap=gap/2=1,这时整个序列就被分为一组即{0,2,1,4,3,5,7,6,9,8},最后再进行调整,就得到了有序序列{0,1,2,3,4,5,6,7,8,9}。
二:希尔排序比插入排序的好处
插入排序只能一个一个往后面移动,希尔排序可以跳着步长移动,小的数很快就会到达最前面。
在这两个部分中,取步长为四,则7和4和0比较,5和3,9和6,8和2在这四个部分中,每个部分都进行一次直接插入排序。
每个小组进行完插入排序之后变成:
在比较第二轮时,我们把步长除以二,此时步长变成了2,数组变成了两组:①0,6,4,9,7 ②3,2,5,8
在每一组中继续进行直接插入排序
结果如下:
再将步长除以2,此时步长为1,也是最后一次排序
希尔排序最重要的就是步长,让步长不断地除以二,直到步长为1,优点是如果在数组最后加入一个小元素,他会被很快移到最前面。
三:希尔排序代码
package totoSort;
import java.util.Arrays;
public class ShellSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arrays = new int[] {1,5,2,3,6,9,4,0,1};
//实现增量的变化
for(int gap = arrays.length / 2; gap > 0; gap /= 2) {
for(int i = gap; i < arrays.length; i++) {
for(int j = i - gap; j >= 0; j -= gap) {
if(arrays[j] > arrays[j + gap]) {
int temp = arrays[j];
arrays[j] = arrays[j + gap];
arrays[j + gap] = temp;
}
}
}
}
System.out.println(Arrays.toString(arrays));
}
}
四:结果
帖子还没人回复快来抢沙发