希尔排序对于多达几千个数据项的,中等大小规模的数组排序表现良好,希尔排序不像快速排序和其它时间复杂度为O(n*logn)的排序算法那么快,因此,对非常大的文件排序,它不是最优选择,但是希尔排序比选择排序和插入排序这种时间复杂度为O(n²)的排序要快的多,并且它非常容易实现,代码简短
希尔排序也是插入排序的一种,在插入排序中,如果最小的数在最后面,则复制的次数太多,而希尔解决了这个问题,它也是n-增量排序,它的思想是通过加大插入排序中元素的间隔,并在这些有间隔的元素中进行插入排序,当这些数据项排过一趟序后,希尔排序算法减小数据项的间隔再进行排序,依此进行下去。进行这些排序时数据项之间的间隔被称为增量,并且习惯上用字母h来表示。
对于某个马上要进行希尔排序的数组,开始的间隔应该更大,然后间隔不段减小,直到间隔变为1.
间隔序列:
间隔序列中的数字素质通常被认为很重要-除了1之外它们没有公约数,这个约束条件使每趟排序更有可能保持前一趟排序已排好的效果,对于不同的间隔序列,有一个绝对的条件,就是逐渐减小的间隔最后一定要等于1.因此最后一趟是一次普通的插入排序。
下面列出的例子是h=h*3+1的规律得出的:
package com.jll.sort; public class ShellSort { int[] arr; int size; public ShellSort() { super(); } public ShellSort(int size) { this.size = size; arr = new int[size]; } /** * @param args */ public static void main(String[] args) { ShellSort ss = new ShellSort(10); for(int i=0;i<10;i++){ ss.arr[i] = (int) ((Math.random()*100)+1); System.out.print(ss.arr[i]+" "); } ss.shellSort(); System.out.println(); System.out.println("after sort:"); for(int i=0;i<10;i++){ System.out.print(ss.arr[i]+" "); } } public void shellSort(){ int h = 1; while(h<=size/3){ h = h*3+1; } for(;h>0;h=(h-1)/3){ for(int i=h;i<size;i++){ int temp = arr[i]; int j = i; while(j>h-1&&arr[j-h]>temp){ arr[j]=arr[j-h]; j-=h; } arr[j]=temp; } } } }
本文向大家介绍Java 插入排序之希尔排序的实例,包括了Java 插入排序之希尔排序的实例的使用技巧和注意事项,需要的朋友参考一下 Java 插入排序之希尔排序的实例 Java代码 运行后的结果为: Java代码 当分割的间隔为1时,变成了直接插入排序。 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率; 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位; 希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“
1. 前言 本节内容是排序算法系列之一:希尔排序,主要讲解了希尔排序的主体思路,选取了一个待排序的数字列表对希尔排序算法进行了演示,给出了希尔排序算法的 Java 代码实现,帮助大家可以更好的理解希尔排序算法。 2. 什么是希尔排序? 希尔排序(Shell Sort),是计算机科学与技术领域中较为简单的一种排序算法。 希尔排序是插入排序的一种,有时候也被称为 “缩小增量排序”。它是插入排序的改进版
本文向大家介绍java数据结构之希尔排序,包括了java数据结构之希尔排序的使用技巧和注意事项,需要的朋友参考一下 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率; 但插入排序一般来说是低效的
希尔排序(有时称为“递减递增排序”)通过将原始列表分解为多个较小的子列表来改进插入排序,每个子列表使用插入排序进行排序。 选择这些子列表的方式是希尔排序的关键。不是将列表拆分为连续项的子列表,希尔排序使用增量i(有时称为 gap),通过选择 i 个项的所有项来创建子列表。 这可以在 Figure 6 中看到。该列表有九个项。如果我们使用三的增量,有三个子列表,每个子列表可以通过插入排序进行排序。完
插入排序 """ 插入排序核心思想 将数组分成一个有序数组和一个无序数组 每次从无序数组中提一个元素出来 插入到 有序元素的合适位置 """ from typing import List def insert_sort(arr: List) -> List: """ 插入排序 :param arr: :return: """ target =