十大排序之希尔排序(四)

希尔排序插入排序的一种
也称缩小增量排序,
非稳定排序算法
思路:如序列9 8 7 6 5 4 3 2 1
确定一个增量序列,如4(length/2) 2 1,
使用第一个增量4,将序列划分为若干个子序列,下标组合为0-4-8,1-5,2-6,3-7
依次对子序列使用直接插入排序
使用第二个增量2,将序列划分为若干个子序列,(0-2-4-6-8),(1-3-5-7)
依次对子序列使用直接插入排序
使用第三个增量1,(0-1-2-3-4-5-6-7-8)
使用直接插入排序,完成排序

时间复杂度n(lg(n))

感受:感觉该排序的思路较为简单,就是比较绕,只要把思路理清就比较容易

public static void main(String[] args) {
  int arr[]= {9,8,7,6,5,4,3,2,1};
  show(arr);
  for(int i=0;i<arr.length;i++) {
   System.out.print(arr[i]+" ");
  }
 }
 public static void show(int []arr) {
  for(int a=arr.length/2;a>0;a=a/2) {
   for(int i=a;i<arr.length;i++) {
    int temp=arr[i];
    int j=i-a;
    while(j>-1&&temp<arr[j]) {
     arr[j+a]=arr[j];
     j=j-a;
    }
    arr[j+a]=temp;
   }
  }
 }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是对题目的回答: 利用增量排序法对给定序列{9, 8, 7, 6, 5, 4, 3, 2, 1}利用增量序列{1, 3, 7}进行排序的过程如下: 首先,取增量1,将序列分为长度为1的子序列,每个子序列都是有序的,因为每个子序列只包含一个元素。 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 然后,取增量3,将序列分为长度为3的子序列,对每个子序列进行插入排序。 9 8 7 | 6 5 4 | 3 2 1 插入排序后: 7 8 9 | 4 5 6 | 1 2 3 最后,取增量7,将序列分为长度为7的子序列,对每个子序列进行插入排序。 7 8 9 4 5 6 1 | 2 3 插入排序后: 1 2 3 7 8 9 4 | 5 6 此时,我们需要将子序列 {4, 5, 6} 插入到已排好序的序列中。 1 2 3 4 5 6 7 8 9 因此,最终得到的排序结果为{1, 2, 3, 4, 5, 6, 7, 8, 9}。 请注意,每个步骤中的空格表示一个空元素,用于表示相邻的子序列之间的间隔。此外,开头和结尾不能有多余的空元素。 ### 回答2: 首先,我们先对增量序列进行遍历,对于每个增量间隔,都进行一次插入排序初始序列为{9, 8, 7, 6, 5, 4, 3, 2, 1},三个增量分别为1,3,7。 1、增量为1时,序列不会发生变化,不需要排序。 2、增量为3时,按照3开始的位置分为三个分组,即(9,6,3)(8,5,2)(7,4,1),对于每个分组分别进行插入排序。 第一步,对于(9,6,3)这个分组,将9与6比较,9大于6,将9向右移一位,保留初始位置,然后再将6移到初始位置。最后序列为(6,9,7,8,5,4,3,2,1)。 第二步,对于(8,5,2)这个分组,将8与5比较,8大于5,将8向右移一位,保留初始位置,然后再将5移到初始位置。同样地,2也需要被移动。最后序列为(6,9,7,5,8,4,3,2,1)。 第三步,对于(7,4,1)这个分组,将7与4比较,7大于4,将7向右移一位,保留初始位置,然后再将4移到初始位置。同样地,1也需要被移动。最后序列为(6,9,4,5,7,1,3,2,8)。 3、增量为7时,按照7开始的位置分为一个分组,即(6,2),进行插入排序。因为已经排好序了,可以直接输出结果。 整个排序过程中,序列被分为了三个分组依次排序,最后得到了排好序的序列(1,2,3,4,5,6,7,8,9)。 ### 回答3: 首先,希尔排序是一种插入排序的变种,通过将原序列拆分成若干子序列分别进行插入排序,最终合并成一个有序序列。而增量序列希尔排序的关键,增量序列的选择会影响希尔排序的效率。 给定初始序列{9, 8, 7, 6, 5, 4, 3, 2, 1},使用增量序列{1, 3, 7}进行排序,其分步结果如下: 第一次排序增量为1,将序列分成9个子序列,每个子序列只有一个元素,此时序列为: 9 8 7 6 5 4 3 2 1 第二次排序增量为3,将序列分成3个子序列,每个子序列为: 9 6 3 8 5 2 7 4 1 对每个子序列分别进行插入排序,得到: 3 6 9 2 5 8 1 4 7 此时序列为: 3 2 1 6 5 4 9 8 7 第三次排序增量为7,将序列分成1个子序列,即整个序列,对整个序列进行插入排序,得到: 1 2 3 4 5 6 7 8 9 最终得到有序序列{1, 2, 3, 4, 5, 6, 7, 8, 9}。 从分步结果可以看出,使用增量序列{1, 3, 7}进行排序,可以快速将序列变为有序。但是,确定最优增量序列仍然是一个开放问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值