视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
word强调文字颜色在哪 怎么清理云储存空间里的东西 用库乐队设置苹果铃声怎么操作 YY上可以怎样创建自己的频道 怎么把cdr导入ps ps如何打字 手机照相怎样显示日期时间 怎么关闭微博视频号 word表格单个大小怎么调整 cdr怎么封套 无线如何隐藏wifi信号 手机预约挂号该怎么取消 电脑qq上怎么删除qq聊天记录 电脑的闹钟可以如何打开 Excel表格开根号公式怎么样计算 开通借呗要如何开通 工人工龄怎么用excel计算 如何一张纸上打印6张ppt 苹果手机设置的定位在哪里 word要怎么样批量处理图片大小 excel中散点图怎么显示公式 手机号暂停服务是指的什么意思 如何将网页上不能复制的文字复制下来 wps怎么设置自动变大写 caj文件该怎么样打开 宏基台式电脑开机密码忘记了怎么办 Word表格如何调整表格大小 如何在excel中改变照片底色 怎么将图片转换成word文档 要怎样用库乐队设置成苹果手机铃声 Word一整页怎么复制 怎么取消亲情号 图片要怎么铺满a4纸打印 cdr咋得才能打开ai文件 手动双面打印纸怎么放翻面 电脑如何压缩图片 手机重置后恢复数据如何操作 Word可以怎么转换成Excel表格 手机号码的服务密码怎么查 删除了微信好友聊天记录对方能看到吗
希尔排序的详细过程
2022-08-04 23:06:40 责编:小采
文档

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

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

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

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

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

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 arr

Go

实例

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++

实例

template<typename T>
void 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 个相等键值的顺序和排序之前它们的顺序相同

下载本文
显示全文
专题商场吊旗有什么优点商场吊旗有什么优点专题买健身手套什么牌子好买健身手套什么牌子好专题健身手套买什么品牌的好健身手套买什么品牌的好专题蒸饺关火后几分钟揭盖蒸饺关火后几分钟揭盖专题2022爱情长久的句子2022爱情长久的句子专题爱到极致的经典句子爱到极致的经典句子专题幼儿园元旦祝福语2022幼儿园元旦祝福语2022专题描写家乡的唯美句子描写家乡的唯美句子专题一个人旅行的句子2022一个人旅行的句子2022专题20岁的朋友圈文案20岁的朋友圈文案专题2022感恩的走心文案2022感恩的走心文案专题养花草发朋友圈文案养花草发朋友圈文案专题冰丝凉席多少d是什么意思冰丝凉席多少d是什么意思专题让人心安朋友圈文案让人心安朋友圈文案专题赞美高山的经典句子赞美高山的经典句子专题赞美芦苇的经典语句赞美芦苇的经典语句专题熔断器和断路器的区别是什么熔断器和断路器的区别是什么专题小说有字数限制吗小说有字数限制吗专题气泵是什么泵气泵是什么泵专题气泵的特点有哪些气泵的特点有哪些专题电动升降桌的优缺点电动升降桌的优缺点专题蠕动泵电机有哪些种类蠕动泵电机有哪些种类专题升降桌的种类和特点升降桌的种类和特点专题电动升降桌单电机和双电机的区别电动升降桌单电机和双电机的区别专题tws真无线蓝牙耳机多少钱tws真无线蓝牙耳机多少钱专题tws真无线蓝牙耳机怎么选购tws真无线蓝牙耳机怎么选购专题tws无线蓝牙耳机怎么看电量tws无线蓝牙耳机怎么看电量专题升降办公桌升不上去怎么办升降办公桌升不上去怎么办专题电动升降桌常见问题及解决方法电动升降桌常见问题及解决方法专题tws耳机怎么调声音大小tws耳机怎么调声音大小专题