ShellSort

思想:待排序的记录按增量分割若干区域,然后对每个区域的对应的元素进行insertionSort。

增量为n/2,即将序列分成两份,注意:增量按需而定
排序前


Paste_Image.png

插入排序后


Paste_Image.png

两个区域内的元素对应逐一排序
Paste_Image.png

增量为n/5

排序前


Paste_Image.png

以此类推...

Java展现其思想

package sortingAlgo;

import java.util.Arrays;
import java.util.Random;

/**
 * @author 水皮蛋 
 * 思想:待排序的记录按增量分割若干区域,然后对每个区域的对应的元素进行
 * 
 */
public class ShellSort {

    public static void main(String[] args) {
        int[] arr = createRandomArray();
        System.out.println(Arrays.toString(arr));
        System.out.println(Arrays.toString(shellSort(arr)));
    }

    /**
     * 每个增量区进行元素对应插入排序
     * 
     * @param arr
     * @param d
     * @return
     */
    public static int[] shellInsertSort(int[] arr, int d) {
        int n = arr.length, j = 0, key = 0;
        // i是未排序的第一个角标
        for (int i = d; i < n; i++) {
            j = i - d;
            key = arr[i];
            while (j >= 0 && arr[j] > key) {
                arr[j + d] = arr[j];
                j -= d;
            }
            arr[j + d] = key;
        }
        return arr;
    }

    /**
     * 每轮增量排序依次
     * 
     * @param arr
     * @return
     */
    public static int[] shellSort(int[] arr) {
        if (arr == null)
            throw new NullPointerException();
        int n = arr.length;
        if (!(n > 1))
            return null;
        // 定义增量
        int d = n / 2;
        while (d >= 1) {
            shellInsertSort(arr, d);
            d /= 2;
        }
        return arr;
    }

    /**
     * 使用Random类产生随机数组的对象
     * 
     * @return 随机数组
     */
    public static int[] createRandomArray() {
        Random random = new Random();
        int[] array = new int[10];
        for (int i = 0; i < 10; i++) {
            array[i] = random.nextInt(100);
        }
        return array;
    }

}

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

推荐阅读更多精彩内容

  • 维基百科解释:希尔排序 希尔排序:也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法...
    王然Gondole阅读 308评论 0 1
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,290评论 0 2
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    zwb_jianshu阅读 1,266评论 0 0
  • 排序的基本概念 在计算机程序开发过程中,经常需要一组数据元素(或记录)按某个关键字进行排序,排序完成的序列可用于快...
    Jack921阅读 1,506评论 1 4
  • 今天出点小意外,车坏半路了。心情极不好。37度高温,汗向下流。 很不巧,工作上经理指出,这不合理那不合理,这没有上...
    沐子芳菲阅读 203评论 0 0