Java中的七大排序_2 希尔排序

希尔排序

简单点说:将元素进行分组,每组在进行组内的插入排序,在重新分组、排序。直到最后全部元素归为一组,做最后一次插入排序
注意:将待排元素分为gap组(gap=gap/3+1),开始gap=array.length。每一组元素也不是位置连续的,
而是把每组中的第一个元素连续放在一起,够gap个后在放每一组的第二个元素。

1.第一组:无序区间第一个数key=array[4]=2

2.第二组:无序区间第一个数key=array[5]=4

3.第三组:无序区间第一数key=array[6]=1

4.第四组:无序区间第一个数key=array[7]=5

5.再接着从第一组的无序区间的第二个元素key=array[8]=2开始
直到key第一轮走完全程,第一轮结束的结果

在会分新的组,gap=gap/3+1=4/3+1=2.分为两组
6.重新分为两组后

再重复以上比较移动交换的操作,完成第二次每组的排序
8.走到最后再分组gap=2/3+1=1组

最终比较完成后结果:

代码实现

//希尔排序
 public static void shellSort(int[] array) {
        int gap = array.length;//分组的个数
        while (true) {
            gap = gap / 3 + 1;
            insertSortWithGap(array, gap);//分组的插入排序
            if (gap == 1) {
                return;
            }
        }
    }
        //每组的组内插入排序
    private static void insertSortWithGap(int[] array, int gap) {
        for (int i = 0; i < array.length - gap; i++) {//假设前gap组已经有序,所以只循环arr.length-gap次
            int key = array[i + gap];//组内排序
            int j;
            for (j = i; j >= 0 && key < array[j]; j -= gap) {
                array[j + gap] = array[j];
            }
            array[j + gap] = key;
        }
    }

原文地址:https://blog.51cto.com/14234228/2434167

时间: 2024-08-02 04:20:03

Java中的七大排序_2 希尔排序的相关文章

Java中的经典算法之选择排序(SelectionSort)

Java中的经典算法之选择排序(SelectionSort) a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录.基于此思想的算法主要有简单选择排序.树型选择排序和堆排序.(这里只介绍常用的简单选择排序) b) 简单选择排序的基本思想:给定数组:int[] arr={里面n个数据}:第1趟排序,在待排序数据arr[1]~arr[n]中选出最小的数

经典排序算法 - 希尔排序Shell sort

经典排序算法 - 希尔排序Shell sort 希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分, 第一部分,希尔排序介绍 第二部分,如何选取关键字,选取关键字是希尔排序的关键 第一块希尔排序介绍 准备待排数组[6 2 4 1 5 9] 首先需要选取关键字,例如关键是3和1(第一步分成三组,第二步分成一组),那么待排数组分成了以下三个虚拟组: [6 1]一组 [2 5]二组 [4 9]三组 看仔细啊,不是临近的两个数字分组,而是3(分成了三组)的倍数的数字分成了一组, 就是每

奔走在算法的大路上(一)排序之希尔排序

希尔排序是插入排序的一种更高效的改进版本.它的作法不是每次一个元素挨一个元素的比较.而是初期选用大跨步(增量较大)间隔比较,使记录跳跃式接近它的排序位置:然后增量缩小:最后增量为 1 ,这样记录移动次数大大减少,提高了排序效率.希尔排序对增量序列的选择没有严格规定. 希尔排序最关键的是选对增量,关于增量的选择,建议参考:http://zh.wikipedia.org/wiki/希尔排序  中的步长序列. 希尔排序的核心思想是:由一定规则将带排序的长序列切割成多个子序列,子序列进行内部插入排序,如

JavaScript排序算法(希尔排序、快速排序、归并排序)

以var a = [4,2,6,3,1,9,5,7,8,0];为例子. 1.希尔排序. 希尔排序是在插入排序上面做的升级.是先跟距离较远的进行比较的一些方法. function shellsort(arr){ var i,k,j,len=arr.length,gap = Math.ceil(len/2),temp; while(gap>0){ for (var k = 0; k < gap; k++) { var tagArr = []; tagArr.push(arr[k]) for (i

高级排序之希尔排序

希尔排序对于多达几千个数据项的,中等大小规模的数组排序表现良好,希尔排序不像快速排序和其它时间复杂度为O(n*logn)的排序算法那么快,因此,对非常大的文件排序,它不是最优选择,但是希尔排序比选择排序和插入排序这种时间复杂度为O(n²)的排序要快的多,并且它非常容易实现,代码简短 希尔排序也是插入排序的一种,在插入排序中,如果最小的数在最后面,则复制的次数太多,而希尔解决了这个问题,它也是n-增量排序,它的思想是通过加大插入排序中元素的间隔,并在这些有间隔的元素中进行插入排序,当这些数据项排过

插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——C++实现

首先是算法实现文件Sort.h,代码如下: /* * 实现了八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 * 以及快速排序.归并排序.堆排序和LST基数排序 * @author gkh178 */ #include <iostream> template<class T> void swap_value(T &a, T &b) { T temp = a; a = b; b = temp; } //插入排序:时间复杂度o(n^2) template<

处理海量数据的高级排序之——希尔排序(C++)

希尔算法简介                                                                                                                                        常见排序算法一般按平均时间复杂度分为两类:O(n^2):冒泡排序.选择排序.插入排序O(nlogn):归并排序.快速排序.堆排序 简单排序时间复杂度一般为O(n^2),如冒泡排序.选择排序.插入排序等高级排序时间复杂

数据结构 排序(希尔排序)

//排序--希尔排序法 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> /* 强调:网上,书上的希尔排序法都有问题 希尔排序并非按一个增量d,将一个数组分成若干小的数组,对每个数组进行插入排序,这个理论不适用下面的代码 也不符合希尔排序的时间复杂度 真正的希尔排序步骤 第一步,通过业界常规 d = 数组长度 / 3 + 1; 求出增量d 第二步:取数组第一个元素

(转载)经典排序算法-希尔排序

经典排序算法 - 希尔排序Shell sort 希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分, 第一部分,希尔排序介绍 第二部分,如何选取关键字,选取关键字是希尔排序的关键 第一块希尔排序介绍 准备待排数组[6 2 4 1 5 9] 首先需要选取关键字,例如关键是3和1(第一步分成三组,第二步分成一组),那么待排数组分成了以下三个虚拟组: [6 1]一组 [2 5]二组 [4 9]三组 看仔细啊,不是临近的两个数字分组,而是3(分成了三组)的倍数的数字分成了一组, 就是每