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

视频号
视频号

抖音
抖音

快手
快手

微博
微博

希尔排序算法代码

文档

希尔排序算法代码

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。
推荐度:
导读希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。
.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语言桶排序 冒泡排序算法流程图 基数排序过程 选择排序算法的思路 希尔排序的基本原理 归并排序的过程举例 快速排序算法例题 堆排序算法操作 计数排序python实现 桶排序原理 冒泡排序例子 基数排序的基数什么意思 选择排序过程 希尔排序c语言实现 归并排序算法的分治方法 快速排序算法c 堆排序法
Top