选择排序算法

复制代码
for(i=0;i<len-1;i++)
{
    for(j=i+1;j<len;j++)
    {
        if(a[i]>a[j])
        {
            temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        }
    }

}

选择排序的步骤

  1. 第一轮 :
    • 遍历整个数组找到最小值,并将其与第一个元素交换。
  2. 第二轮 :
    • 从第二个元素开始遍历剩余的部分找到最小值,并将其与第二个元素交换。
  3. 继续进行 :
    • 重复上述过程,直到剩下最后一个元素不需要再进行任何比较和交换。

在最后一轮中,只剩下两个元素,倒数第二个元素与最后一个元素进行比较,确定了它们的位置。

示例

假设有一个数组 [1, 9, 0, 3, 4, 5, 6, 7]。

  • 第1轮(i = 0):找到最小值 0,将其与第一个元素 1 交换,结果为 [0, 9, 1, 3, 4, 5, 6, 7]。
  • 第2轮(i = 1):找到剩余部分最小值 1,将其与第二个元素 9 交换,结果为 [0, 1, 9, 3, 4, 5, 6, 7]。
  • 第3轮(i = 2):找到剩余部分最小值 3,将其与第三个元素 9 交换,结果为 [0, 1, 3, 9, 4, 5, 6, 7]。
  • 依此类推,直到第7轮(i = 6):找到剩余部分最小值 6,将其与倒数第二个元素 9 交换,结果为 [0, 1, 3, 4, 5, 6, 7, 9]。

到此为止,数组已经有序,而最后一个元素 9 自动成为最大值。

外层循环for(i=0;i<len-1;i++)

确定当前循环的位置

循环条件是i<len-1

是因为在选择排序的每一轮中,把一个元素放在它最终的位置上。到达最后一轮时,倒数第二个位置将自动成为最大的元素,所以最后一个位置的元素已经是有序的,不再需要进行比较和交换。

i < len - 1 是为了保证每一轮排序中都能找到一个未排序部分的最小值并将其放在正确的位置,避免对最后一个元素进行多余的比较和交换。

内层循环for(j=i+1;j<len;j++)

进行比较和数据交换

在选择排序算法的实现中,内层循环的条件 j = i + 1; j < len; j++ 是为了找到当前未排序部分中的最小值,并将其与当前元素交换。

  1. j = i + 1 :内层循环的起始索引 j 从 i + 1 开始,这是因为在选择排序的第 i 轮中,我们假设第 i 个元素是当前未排序部分中的最小值,然后从第 i + 1 个元素开始遍历剩余未排序的元素来找到真正的最小值。如果从 i 开始,会无意义地与自身进行比较。

  2. j < len :内层循环的终止条件是 j 小于数组长度 len,即内层循环会遍历到数组的最后一个元素,确保比较到每一个未排序的元素。

通过这样的设计,选择排序确保每一轮都能找到当前未排序部分中的最小值,并将其放到正确的位置。

相关推荐
ZhengEnCi1 小时前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
吞下星星的少年·-·5 小时前
Div.3 CF 1131A题(排序,模拟)
算法·模拟·排序
aichitang20246 小时前
代数拓扑学与现代前沿视角
考研·算法·数学建模·ai·拓扑学·高考
二本咕咕-机械转码6 小时前
FreeRTOS深入解析(一)_链表与并发保护——哨兵循环链表、排序键游标、临界区与关调度
单片机·算法·链表
-银雾鸢尾-6 小时前
两数之和-C++实现
c++·算法
j7~6 小时前
【动态规划算法专题】动态规划五部曲实战:泰波那契数、三步问题、最小花费爬楼梯
c++·算法·动态规划·数据结构与算法
倍利福猎头公司官方账号6 小时前
大企业HR如何向猎头公司清晰传达AI岗位的技术需求?
人工智能·算法·机器人·求职招聘·业界资讯
揽星河..7 小时前
【C++】类和对象
c++·算法
D e re k ZH7 小时前
C++ 并发、未定义行为与工程化难点(No 3)
数据结构·c++·算法·面试