希尔排序(JAVA)

算法


  希尔排序是对直接插入排序的改进,但其本质上仍然是插入排序,只不过它设置了步长,就变成了跨步长的插入排序。当步长为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();
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 插入排序 直接插入排序的基本思想:每次将一个待排序的记录,按其keyword的大小插入到前面已经排好的子序列中的适...
    Sunrain16阅读 1,164评论 0 3
  • 文 | 莫若吻 (注:如果想更好的理解希尔排序,请先看看我的上一篇博客插入排序,希望会对你有帮助。) 一、简介 希...
    Promise_Sun阅读 66,044评论 18 62
  • -希尔排序 克服插入排序每次只能交换一对元素的缺点5-间隔的排序,3-间隔的排序,1-间隔排序(最后必须是1-间隔...
    Spicy_Crayfish阅读 650评论 0 0
  • 坐车做了好久,估计快一个小时,来到重庆市血液中心。这货居然在渝中区这边。堵车好烦的。 来到这边,我测了体重,64了...
    xiao钱钱阅读 113评论 0 0
  • Objective 你对今天学的记得什么? 呆萌写作营的课程非常实用、高效。第一周课程中,樊老的“钻石法则”、“问...
    happycc阅读 135评论 0 0