美文网首页程序员
希尔排序(JAVA)

希尔排序(JAVA)

作者: 林天涯 | 来源:发表于2018-01-01 11:42 被阅读0次

    算法


      希尔排序是对直接插入排序的改进,但其本质上仍然是插入排序,只不过它设置了步长,就变成了跨步长的插入排序。当步长为1时,它就是直接插入排序。
      初始时设置步长d为n/2,按照直接插入排序进行,若a[i]<a[i-d]表名a[i]为待排序元素,从后向前与a[i-d],a[i-2d]……比较,若待排序元素小于比较元素,则比较元素向后移位,腾出位置。一趟结束后将待排序元素赋值到空出位置。而后不断更新d=d/2,直到步长为0,排序结束。

    例子


    仍以序列4,3,1,2,5为例


    示例

    Codes


    package com.fairy.InnerSort;
    
    import java.util.Scanner;
    /**
     * 希尔排序
     * @author Fairy2016
     *
     */
    public class SheerSort {
        
        public static void sort(int a[], int n) {
            int denSity = n / 2;//步长,初始为n/2
            int i, j;
            while(denSity >= 1) {
                for(i = denSity+1; i <= n; i++) {
                    if(a[i] < a[i-denSity]) {
                        a[0] = a[i];//非探针,仅作存储
                        for(j = i-denSity; j > 0 && a[j] > a[0]; j-=denSity) {
                            a[j+denSity] = a[j];//依然是边比较边移位
                        }
                        a[j+denSity] = a[0];//赋值到位置
                    }
                }
                denSity /= 2;//更新步长
            }
        }
    
        public static void Print(int a[], int n) {
            for(int i = 1; i <= n; i++) {
                System.out.print(a[i]+" ");
            }
        }
    
        public static void main(String args[]) {
            int n;
            int a[];
            Scanner scanner = new Scanner(System.in);
            while(scanner.hasNext()) {
                n = scanner.nextInt();
                if(n > 0) {
                    a = new int[n+1];
                    for(int i=1; i <= n; i++) {
                        a[i] = scanner.nextInt();
                    }
                    sort(a, n);
                    Print(a, n);
                }
            }
            scanner.close();
        }
    }
    
    

    相关文章

      网友评论

        本文标题:希尔排序(JAVA)

        本文链接:https://www.haomeiwen.com/subject/etftnxtx.html