算法 希尔排序

7 篇文章 0 订阅
  1. 算法
    1. 第一次先将步长定义为数组长度的二分之一。
    2. 遍历整个数组的每一个元素,如果符合
      1. 当前元素下标 - 步长 >= 0 (也就是说当前下边往前数 步长 个数组还有元素)
      2. 如果当前的元素比步长个元素的元素小的话
      3. 将两个元素的位置交换
    3. 将步长定义为第一个步骤的二分之一,再来一次,知道步长为为止,需要注意的是步长为1的时候还是需要遍历的,这是最后一个处理,也就是一次简单插入排序。
  2. 比直接插入算法的优势
    1. 通过第一次比较的步长可以比较快地发现比较小地元素并且将它往前移动比较多的位置,避免了直接插入排序一旦小元素在数组靠后的位置的时候需要移动大量元素的弊端。
      package hill_sorting;
      
      import java.util.Arrays;
      
      public class HillSortingTest {
          static  int testArr[] = {9,8,7,6,5,4,3,2,1};
          public static void main(String[] args) {
              hillSorting(testArr );
              System.out.println(Arrays.toString(testArr));
          }
      
          private static void hillSorting(int []array ){
      //        遍历所有的不长,需要注意的时当步长为1的时候依然需要遍历
              for (int d = array.length/2; d>0; d/=2){
      //            遍历所有的元素,在不同步长的时候都是需要挨个遍历的,然后挨个处理
                  for(int i = d; i< array.length; i++){
      //                遍历本组中所有的元素,这是很关键的
      //                  1、上一个for中比遍历的起点是d,d是步长举个例子,当步长为2的时候,就是从下标为2的元素开始遍历的
      //                          这里将开始下标减去了步长,所以是从第一个元素开始遍历
      //                  2、在上一个for中例如步长为2,现在遍历的 i 值为7,那么下边的循环就是先遍历第五个和第七个,在遍历
      //                          第三个和第五个,在遍历第一个和第三个不断地比较,不断地把小的元素往前挪/
                      for(int j = i-d; j>=0; j-=d){
                          if(array[j] > array[j+d]){
                              int temp = array[j];
                              array[j] = array[j+d];
                              array[j+d] = temp;
                          }
                      }
                  }
              }
          }
      
      
      
      }
      

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值