排序算法---(二)

引言

紧接上文,我们再来讲解一下两种排序:希尔排序、简单选择排序

希尔排序

1.思路

希尔排序离不开插入排序,整体思路是先选一个递减的间隔序列,按照间隔分组,每组做插入排序,间隔不断缩小,直到间隔为1就完成了整体插入排序

具体的插入排序流程请看上文,这里博主依旧写步骤带大家清晰的看一下排序逻辑:

复制代码
待排序数组:[8, 9, 1, 7, 2, 3, 5, 4, 6, 0]
长度 n = 10
间隔 gap:5->2->1

gap=5:
组 1:下标 0,5 → [8, 3]
组 2:下标 1,6 → [9, 5]
组 3:下标 2,7 → [1, 4]
组 4:下标 3,8 → [7, 6]
组 5:下标 4,9 → [2, 0]
每组分别插入排序:
[8,3] → [3,8]
[9,5] → [5,9]
[1,4] → [1,4]
[7,6] → [6,7]
[2,0] → [0,2]
排序后数组为:[3, 5, 1, 6, 0, 8, 9, 4, 7, 2]

gap=2(差距为2,但是要一直++,所以隔一个元素为一组)
组 1:下标 0,2,4,6,8 → [3, 1, 0, 9, 7]
组 2:下标 1,3,5,7,9 → [5, 6, 8, 4, 2]
分别插入排序:
组 1:[3,1,0,9,7]
1 插入 → [1,3,0,9,7]
0 插入 → [0,1,3,9,7]
9 不动
7 插入 → [0,1,3,7,9]
组 2:[5,6,8,4,2]
6 不动
8 不动
4 插入 → [4,5,6,8,2]
2 插入 → [2,4,5,6,8]
排序后数组:[0, 2, 1, 4, 3, 5, 7, 6, 9, 8]

gap=1(此时就是普通插入排序)
此处省略,不懂请看上文

2.代码

复制代码
//希尔排序
for(int h=n/2;h>=1;h/=2){
    for(int j=h;j<n;j++){
        for(int i=j-h;i>=0;i-=h){
            if(arr[i]>arr[i+h]){
                int temp=arr[i];
                arr[i]=arr[i+h];
                arr[i+h]=temp;
            }
        }
    }
}

简单选择排序

1.思路

先假设minIndex为 i ,从下标为 i=0 位置开始,找到 i 之后数组的最小值,找到就和minIndex交换数值,记录该轮的最小值和指针 i 所指元素进行交换,交换完 i 往后走,重复以上步骤,这样就实现了每一轮都找到了最小值(当前),找到就依次放前面

这里博主手写了两轮的逻辑,剩下以此类推:

2.代码

java 复制代码
//简单选择排序
for(int i=0;i<n;i++){
    int minIndex=i;
    for(int j=i+1;j<n;j++){
        if(arr[j]<arr[minIndex]){
            minIndex=j;
        }
    }
    int temp=arr[i];
    arr[i]=arr[minIndex];
    arr[minIndex]=temp;
}

小舟有话说

还有其他排序,博主会一一讲解的,这个排序的代码初学者尽量默写下来,这个还是很重要的!如果觉得博主写的不错,点点赞点点关注吧,下次找我不迷路~

相关推荐
郝学胜-神的一滴2 小时前
从线程栈到表达式求值:栈结构的核心应用与递归实现
开发语言·数据结构·c++·算法·面试·职场和发展·软件工程
sonnet-10292 小时前
交换排序算法
java·c语言·开发语言·数据结构·笔记·算法·排序算法
穿条秋裤到处跑2 小时前
每日一道leetcode(2026.03.27):循环移位后的矩阵相似检查
算法·leetcode·矩阵
Cathy Bryant2 小时前
拓扑学-毛球定理
笔记·线性代数·算法·矩阵·拓扑学·高等数学
2301_788770552 小时前
模拟OJ3
数据结构·算法
靠沿2 小时前
【递归、搜索与回溯算法】专题二——二叉树的dfs
算法·深度优先
美式请加冰2 小时前
BFS算法的介绍和使用(上)
算法·宽度优先
sonnet-10292 小时前
堆排序算法
java·c语言·开发语言·数据结构·python·算法·排序算法
我是咸鱼不闲呀2 小时前
力扣Hot100系列24(Java)——[回溯]总结(下)(括号生成,单词搜索,分割回文串)
java·算法·leetcode