排序算法---希尔排序

1. 基本思想

希尔排序是插入排序的一种,它与直接插入排序不同的是,它会优先比较距离较远的元素,因此希尔排序又被称为"缩小增量排序"。希尔排序的实现思路是:先将整个待排序的记录序列分割成为若干子序列 分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。

2. 实现逻辑

(1)首先选取一个步长gap,通常是数组长度的一半,向上取整和向下取整都可以

(2)所有距离为gap的倍数的记录放在同一个组中,在各组内进行直接插入排序。

(3)改变步长 gap = gap/2, 重复操作,直至完全有序

3. 案例:

对数组 [9,1,2,5,7,4,8,6,3,5] 进行排序

3.1 流程图

3.2 实现代码

javascript 复制代码
        function shellSort(arr) {
            let len = arr.length
            let count = 0
            for (let gap = parseInt(len / 2); gap > 0; gap = parseInt(gap / 2)) {
                // 外层循环将数组分成若干组
                for (let i=gap; i<len; i++) {  
                    // 内层遍历每组中所有的元素,对每一组进行插入排序
                    for (let j=i-gap; j>=0; j-=gap) {
                        if (arr[j] > arr[j+gap]){
                            let temp = arr[j]
                            arr[j] = arr[j+gap]
                            arr[j+gap] = temp
                        }
                    }
                }

                console.log(`希尔排序第${++count}轮结束后,数组变为:${arr}`)
            }
         }
         let arr = [9,1,2,5,7,4,8,6,3,5]
         shellSort(arr)

3.3 结果

4. 复杂度分析

4.1 时间复杂度

4.2 空间复杂度

4.3 稳定性

我们在分布对数组进行排序的时候,很有可能将两个相同值的元素的相对位置进行改变,所以希尔排序是不稳定的排序算法

相关推荐
夜雨翦春韭6 分钟前
【代码随想录Day31】贪心算法Part05
java·数据结构·算法·leetcode·贪心算法
C++忠实粉丝6 小时前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
ZZZ_O^O6 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
代码雕刻家7 小时前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
Kalika0-09 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
代码雕刻家9 小时前
课设实验-数据结构-单链表-文教文化用品品牌
c语言·开发语言·数据结构
小字节,大梦想10 小时前
【C++】二叉搜索树
数据结构·c++
我是哈哈hh11 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝
丶Darling.11 小时前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
labuladuo52011 小时前
Codeforces Round 977 (Div. 2) C2 Adjust The Presentation (Hard Version)(思维,set)
数据结构·c++·算法