ShellSort

作者: 最爱水皮蛋 | 来源:发表于2016-12-06 10:34 被阅读0次

思想:待排序的记录按增量分割若干区域,然后对每个区域的对应的元素进行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;
    }

}

相关文章

  • ShellSort

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

  • shellsort

    shell sort是insertion sort的一种,insertion sort每次只将元素移动一个位置,效...

  • shellSort

    希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以...

  • 算法4 Java解析:习题 2.1.12

    算法4 Java解析:习题 2.1.12 问题 Instrument shellsort to print the...

  • 排序算法-7---希尔排序

    排序算法-7---希尔排序 概念 希尔排序(Shellsort),也称递减增量排序算法,是一种典型的插入排序算法,...

  • 数据结构算法-希尔排序

    希尔排序原理 现在,我要讲解的算法叫希尔排序(ShellSort)。希尔排序是D.L.Shell于1959年提出来...

  • 希尔排序

    希尔排序(Shellsort)的名称源于它的发明者 Donald Shell,该算法是冲破二次时间屏障的第一批算法...

  • 排序算法之6:希尔排序 ShellSort

    维基百科解释:希尔排序 希尔排序:也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法...

  • 算法(一)之排序算法(四)——希尔排序(ShellSort)

    希尔排序也是八大排序算法之一,它是在插入排序的基础上演变而来的,也称缩小增量排序,是直接插入排序算法的一种更高效的...

网友评论

      本文标题:ShellSort

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