更多精彩内容,欢迎关注:

视频号
视频号

抖音
抖音

快手
快手

微博
微博

希尔排序数据结构

文档

希尔排序数据结构

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。
推荐度:
导读希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。
.example-btn{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.example-btn:hover{color:#fff;background-color:#47a447;border-color:#398439}.example-btn:active{background-image:none}div.example{width:98%;color:#000;background-color:#f6f4f0;background-color:#d0e69c;background-color:#dcecb5;background-color:#e5eecc;margin:0 0 5px 0;padding:5px;border:1px solid #d4d4d4;background-image:-webkit-linear-gradient(#fff,#e5eecc 100px);background-image:linear-gradient(#fff,#e5eecc 100px)}div.example_code{line-height:1.4em;width:98%;background-color:#fff;padding:5px;border:1px solid #d4d4d4;font-size:110%;font-family:Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;word-break:break-all;word-wrap:break-word}div.example_result{background-color:#fff;padding:4px;border:1px solid #d4d4d4;width:98%}div.code{width:98%;border:1px solid #d4d4d4;background-color:#f6f4f0;color:#444;padding:5px;margin:0}div.code div{font-size:110%}div.code div,div.code p,div.example_code p{font-family:"courier new"}pre{margin:15px auto;font:12px/20px Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;border:1px solid #ddd;border-left-width:4px;padding:10px 15px}

排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。以下是希尔排序算法:

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;

希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。

1. 算法步骤

选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;

按增量序列个数 k,对序列进行 k 趟排序;

每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

2. 动图演示

代码实现JavaScript实例 function shellSort(arr) {    var len = arr.length,        temp,        gap = 1;    while(gap < len/3) {          //动态定义间隔序列        gap =gap*3+1;    }    for (gap; gap > 0; gap = Math.floor(gap/3)) {        for (var i = gap; i < len; i++) {            temp = arr[i];            for (var j = i-gap; j >= 0 && arr[j] > temp; j-=gap) {                arr[j+gap] = arr[j];            }            arr[j+gap] = temp;        }    }    return arr;}Python实例 def shellSort(arr):    import math    gap=1    while(gap < len(arr)/3):        gap = gap*3+1    while gap > 0:        for i in range(gap,len(arr)):            temp = arr[i]            j = i-gap            while j >=0 and arr[j] > temp:                arr[j+gap]=arr[j]                j-=gap            arr[j+gap] = temp        gap = math.floor(gap/3)    return arrGo实例 func shellSort(arr []int) []int {        length := len(arr)        gap := 1        for gap < length/3 {                gap = gap*3 + 1        }        for gap > 0 {                for i := gap; i < length; i++ {                        temp := arr[i]                        j := i - gap                        for j >= 0 && arr[j] > temp {                                arr[j+gap] = arr[j]                                j -= gap                        }                        arr[j+gap] = temp                }                gap = gap / 3        }        return arr}Java实例 public static void shellSort(int[] arr) {    int length = arr.length;    int temp;    for (int step = length / 2; step >= 1; step /= 2) {        for (int i = step; i < length; i++) {            temp = arr[i];            int j = i - step;            while (j >= 0 && arr[j] > temp) {                arr[j + step] = arr[j];                j -= step;            }            arr[j + step] = temp;        }    }}PHP实例 function shellSort($arr){    $len = count($arr);    $temp = 0;    $gap = 1;    while($gap < $len / 3) {        $gap = $gap * 3 + 1;    }    for ($gap; $gap > 0; $gap = floor($gap / 3)) {        for ($i = $gap; $i < $len; $i++) {            $temp = $arr[$i];            for ($j = $i - $gap; $j >= 0 && $arr[$j] > $temp; $j -= $gap) {                $arr[$j+$gap] = $arr[$j];            }            $arr[$j+$gap] = $temp;        }    }    return $arr;}C实例 void shell_sort(int arr[], int len) {        int gap, i, j;        int temp;        for (gap = len >> 1; gap > 0; gap >>= 1)                for (i = gap; i < len; i++) {                        temp = arr[i];                        for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap)                                arr[j + gap] = arr[j];                        arr[j + gap] = temp;                }}C++实例 templatevoid shell_sort(T array[], int length) {    int h = 1;    while (h < length / 3) {        h = 3 * h + 1;    }    while (h >= 1) {        for (int i = h; i < length; i++) {            for (int j = i; j >= h && array[j] < array[j - h]; j -= h) {                std::swap(array[j], array[j - h]);            }        }        h = h / 3;    }}

参考地址:

https://github.com/hustcc/JS-Sorting-Algorithm/blob/master/4.shellSort.md

https://zh.wikipedia.org/wiki/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F

以下是热心网友对希尔排序算法的补充,仅供参考:

热心网友提供的补充1:

我看这个没把 C# 版本写出来,我写了一下,下面是 C# 版本:

static void ShellSort(int[] arr)
{
    int gap = 1;

    while (gap < arr.Length)
    {
        gap = gap * 3 + 1;
    }

    while (gap > 0)
    {
        for (int i = gap; i < arr.Length; i++)
        {
            int tmp = arr[i];
            int j = i - gap;
            while (j >= 0 && arr[j] > tmp)
            {
                arr[j + gap] = arr[j];
                j -= gap;
            }
            arr[j + gap] = tmp;
        }
        gap /= 3;
    }
}
以上为希尔排序算法详细介绍,插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等排序算法各有优缺点,用一张图概括:

关于时间复杂度

平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序。

线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序;

O(n1+§)) 排序,§ 是介于 0 和 1 之间的常数。 希尔排序

线性阶 (O(n)) 排序 基数排序,此外还有桶、箱排序。

关于稳定性

稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。

不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。

名词解释:

n:数据规模

k:"桶"的个数

In-place:占用常数内存,不占用额外内存

Out-place:占用额外内存

稳定性:排序后 2 个相等键值的顺序和排序之前它们的顺序相同

文档

希尔排序数据结构

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。
推荐度:
为你推荐
资讯专栏
热门视频
相关推荐
简单选择法排序 冒泡排序图解 希尔排序的算法流程图 直接选择排序比较次数 冒泡排序结果 c语言希尔排序例题 直接选择排序c语言 冒泡排序算法代码 选择排序算法c 冒泡排序c语言代码 选择一个排序算法时要考虑 增加标志的冒泡法排序 简单选择排序图解 冒泡排序流程图怎么画 直接选择排序法图解 冒泡排序 c语言数组选择排序 冒泡排序比较次数公式 简单选择排序过程 数据结构冒泡排序 冒泡排序分析 冒泡排序比较次数 直接选择排序图解 希尔排序c语言代码 冒泡排序法C语言 选择排序的原理 希尔排序算法c语言 归并排序是如何进行的 c语言冒泡排序法详解 选择排序怎么排 数据结构希尔排序算法 归并排序的基本思想 冒泡排序优化思路 选择排序法排序十个数 希尔排序图解 归并排序算法伪代码 java冒泡排序算法代码 c语言选择法排序讲解 数据结构希尔排序例子 合并排序和归并排序
Top