希尔排序

希尔排序

一、概念及其介绍

希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。

希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。

它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。

1024555-20161128110416068-1421707828

//缩小增量排序
//是插入排序的优化---交换法
public class ShellSort {
public static void main(String[] args) {
int arr[] = {8,9,1,7,2,3,5,4,6,0}; //10个数
shellSort(arr);
}
public static void shellSort(int arr[]){
for (int d = arr.length / 2;d>0;d /= 2){ //d:增量 5 2 1
for (int i = d; i < arr.length; i++){ // i = 6
//i:代表即将插入的元素角标,作为每一组比较数据的最后一个元素角标
//j:代表与i同一组的数组元素角标
for (int j = i-d; j>=0; j-=d){ //在此处-d 为了避免下面数组角标越界
if (arr[j] > arr[j + d]) {// j+d 代表即将插入的元素所在的角标
//符合条件,插入元素(交换位置)
int temp = arr[j];
arr[j] = arr[j + d];
arr[j + d] = temp;
}
}
}
System.out.println("第"+d+"轮插入");
System.out.println(Arrays.toString(arr));
}
}
}

二 优化

  • 一种优化方法就是使用更高性能的递增序列
  • 因为是基于插入排序,所以希尔排序的优化可以借鉴简单插入排序的优化方法处理
//希尔排序的优化---移位法
public class ShellSort优化 {
public static void main(String[] args) {
int arr[] = {8,9,1,7,2,3,5,4,6,0}; //10个数
shellSort(arr);
}
public static void shellSort(int arr[]) {
for (int d = arr.length / 2; d > 0; d /= 2) { //d:增量 5 2 1
for (int i = d; i < arr.length; i++) { // i = 6
int j = i;
int temp = arr[j];
if (arr[j] < arr[j - d]) {
while (j - d >= 0 && temp < arr[j - d]) {
arr[j] = arr[j - d];
j -= d;
}
arr[j] = temp;
}
}
System.out.println("第" + d + "轮插入");
System.out.println(Arrays.toString(arr));
}
}
}
posted @   被动  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示