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

视频号
视频号

抖音
抖音

快手
快手

微博
微博

希尔排序c语言

文档

希尔排序c语言

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。
推荐度:
导读希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。
.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语言选择法排序10个数 用冒泡排序法求闰年 归并排序的详细过程 希尔排序c语言程序 c语言选择排序算法 c语言冒泡排序10个数 归并排序代码 希尔排序法 选择排序算法流程图 冒泡排序的原理 归并排序思路 堆排序c语言代码 java冒泡排序 选择排序思想 希尔排序又叫什么名字 归并排序算法原理 堆排序算法c语言 冒泡排序c语言 选择排序算法例子 数据结构希尔排序c语言 归并排序算法流程图解 堆排序计算 冒泡排序流程图 排序算法的一般选择规则 希尔排序c 实现归并排序利用的算法 堆是一种什么排序方法 降序排序冒泡排序优化 什么是选择排序法 数据结构希尔排序流程图
Top