zoukankan      html  css  js  c++  java
  • Java排序算法之希尔排序

      希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一种更高效的版本,也成为缩小增量排序。

    一、算法原理

      现在有一个array,希尔排序就是设定一个增量incrementNum(0<incrementNum<array.length)。

      先从array[0]开始,以incrementNum为增量的进行直接插入排序,直到数组末尾,然后从array[1]开始重复:以incrementNum为增量的进行直接插入排序; 然后从array[1]开始重复......一直到array[n]。

      然后取一个小于上一步增量的新的增量(比如设置为incrementNum/2),对前一个步骤的结果array进行遍历,直接插入排序....

      再取小于上一步增量的新的增量,重复进行:遍历,直接插入排序

      直到新的增量小于1之后再退出循环。

    二、举例实现

      比如现在有数组 {82 ,31 ,29 ,71, 72, 42, 64, 5,110}  

      第一次取增量设置为array.length/2 = 4 。先从82开始以4为增量遍历直到末尾,得到(82,42) 排序得到{42 ,31 ,29 ,71, 72, 82, 64, 5,110}。 然后从第二个数31开始重复上一个步骤,得到(31,64) 排序得到{42 ,31 ,29 ,71, 72, 82, 64, 5,110}.......   以4为增量的遍历完数组之后,得到的结果是{42 ,31,5,71,72,82,64,29,110}

      然后重新取增量,设定为incrementNum/2 = 2,对{42 ,31,5,71,72,82,64,29,110}重复步骤1。  

      完事之后,在取新的增量,重复步骤1。 直到取到的增量小于1,退出循环。

    三、算法实现

     1 package recursion;
     2 
     3 import java.util.Arrays;
     4 
     5 /**
     6  * @author zsh
     7  * @company wlgzs
     8  * @create 2019-02-16 15:14
     9  * @Describe 希尔排序实现
    10  */
    11 public class ShellSort {
    12 
    13     /**
    14      * 希尔排序实现方法
    15      * @param arr 待排序的数组
    16      * @return 排序过的数组
    17      * 一趟一个增量,用增量来分组,组内执行插入排序
    18      */
    19     static int[] shellSort(int[] arr){
    20         //不断的减小增量 增量位incrementNum/2
    21         for (int incrementNum = arr.length / 2 ; incrementNum > 0 ; incrementNum = incrementNum /2) {
    22             for (int i = incrementNum; i < arr.length; i++) {
    23                 //待插入的数
    24                 int target = arr[i];
    25                 //待插入数索引的前增量个数的增量
    26                 int j = i - incrementNum;
    27                 while (j >-1 && target < arr[j]){
    28                     arr[j+incrementNum] = arr[j];
    29                     j = j - incrementNum;
    30                 }
    31                 arr[j+incrementNum] = target;
    32             }
    33         }
    34         return arr;
    35     }
    36 
    37     public static void main(String[] args) {
    38         int[] arr = new int[]{82 ,31 ,29 ,71, 72, 42, 64, 5,110};
    39         System.out.println(Arrays.toString(shellSort(arr)));
    40     }
    41 }
  • 相关阅读:
    菜鸟攻城狮4(基本语法)
    Spring 3.x 企业引用开发实战(陈雄华/林开雄)
    进击的菜鸟问题1(设置checkbox全选)
    Maven实战
    菜鸟攻城狮3(Holle World)
    菜鸟攻城狮2(JAVA开发环境)
    git基本使用
    跨域问题及解决跨域的方案
    原生ajax相关概念
    php服务器语言,MySQL数据库以及php怎么操作数据库
  • 原文地址:https://www.cnblogs.com/zsh-blogs/p/10387914.html
Copyright © 2011-2022 走看看