插入排序-希尔排序

来源:互联网 发布:淘宝怎么弄到很多小号 编辑:程序博客网 时间:2024/05/16 06:19

Shell排序算法严格来说基于插入排序的思想,其又称为希尔排序或者缩小增量排序。

基本思想:

先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

排序流程

  1. 将有N个元素的数组分成n/2个数字序列,第1个数据和第n/2+1个数据为一对
  2. 一个循环是每一个序列对排好顺序。
  3. 然后,再变为n/4 个序列,再次排序。
  4. 不断重复上诉过程,随着序列的减少最后变为一个,也就完成了整个排序。

希尔排序

例如

对于序列 127,118,105,101,112,100

初始:[127, 118, 105, 101, 112, 100]

第1次:[101, 112, 100, 127, 118, 105]

第2次:[100, 101, 105, 112, 118, 127]

执行步骤

  1. 第1次:首先将数组分为6/2=3个数字序列,第1个数据127和第4个数据101,第2个数据118和第5个数据112位一对,第3个数据和第6个数据为一对。每一对数据进行排序,此时排序后的数据为[101, 112, 100, 127, 118, 105]
  2. 第2次:将数组分为6/4=1 个序列,此时诸葛对数据比较,按照插入的排序算法对这个序列进行排序,排序后的数据为[100, 101, 105, 112, 118, 127]

示例代码

public class SheelSortDemo {    public static void main(String[] args) {        int[] a = { 127,118,105,101,112,100};        System.out.println("初始:" + Arrays.toString(a));        sheel(a);    }    //希尔排序    public static void sheel(int[] a){        int d=a.length;        int temp;        int count=0;        while(d!=1){            d=d/2;            for (int i = 0; i < a.length; i++) {                for ( int j= i+d; j<a.length;j+=d){                    int k=j-d;                    temp=a[j];                    for(;k>=0 && temp < a[k];k-=d){                        a[k+d]=a[k];                    }                    a[k+d]=temp;                }            }            System.out.println("第"  + ++count + "次:" + Arrays.toString(a));        }    }}
0 0
原创粉丝点击