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

视频号
视频号

抖音
抖音

快手
快手

微博
微博

数据结构希尔排序流程图

文档

数据结构希尔排序流程图

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。
推荐度:
导读希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。
.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语言 归并排序算法原理 希尔排序又叫什么名字 选择排序思想 java冒泡排序 堆排序c语言代码 归并排序思路 希尔排序c语言 归并排序算法c语言 快速排序算法原理 堆排序是稳定的排序算法 桶排序java 冒泡排序法的基本思路 c语言选择排序从小到大 希尔排序法是怎么排的 归并排序怎么排 快速排序怎么排 堆排序思想 c语言桶式排序 冒泡法排序c语言编写 选择排序发 希尔排序代码实现 归并排序算法详解 快速排序的详细过程 堆排序代码数据结构 桶排序是什么意思 冒泡排序代码 基数排序c
Top