【排序】详解选择排序

一、思想

选择排序的原理与思想非常直观和简单,它通过不断地选择未排序部分的最小(或最大)元素,并将其放到已排序部分的末尾来实现排序。

具体来说,选择排序的过程可以分解为以下几个步骤:

  1. 寻找最小(或最大)元素:从未排序的序列中找到最小(或最大)的元素。
  2. 交换位置:将找到的最小(或最大)元素与序列中的第一个位置的元素进行交换。
  3. 缩小未排序范围:将序列的第一个位置排除在未排序的范围之外,因为它已经被放置在正确的位置上了。
  4. 重复过程:重复上述步骤,每次从未排序的部分中寻找最小(或最大)元素,然后将其放到已排序部分的末尾,直到所有元素都排序完毕。

选择排序的时间复杂度为O(n^2),其中n是序列的长度。这是因为对于每个元素,我们都需要遍历剩余的未排序元素来找到最小(或最大)值。尽管它在算法效率上不是最优的,但由于其实现简单,对于小数据集或者基本有序的数据集,选择排序是一个不错的选择。

二、图解

依旧将数组分为已排序部分跟为排序部分,初识时定义一个指针指向已排序部分的下一个位置,然后定义一个指针指向未排序部分,依次遍历未排序部分寻找未排序部分的最小值,寻找到后与已排序部分的下一个位置进行交换依次重复。开始时i指向已排序部分的下一个位置,j指针在未排序部分寻找最小值

此时minIndex指向了最小值,于是将他与i位置进行交换,之后i指向下一个位置,j依旧在剩余未排序部分去寻找最小值,重复上述步骤

我们也可以进行优化,找一个是找要两个也是找,将数组整个分为三段[0,l -1](前已排序部分), [l, r](未排序部分), [r+1, n](后已排序部分)我们可以同时在未排序部分寻找未排序部分的最小值和最大值,最小值与l交换,最大值与r交换,这里要注意的时在将最小值与l交换后,需要判断我们寻找到的最大值是否指向l,如果指向l,在前面最小值与l交换中,l指向的位置已经被交换到了minIndex位置,此时我们需要将maxIndex的位置进行修改,确保最大值不变

三、代码实现

寻找最小值

cpp 复制代码
    public static void selectSort(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }
            swap(arr, i, minIndex);
        }
    }

同时寻找最大值与最小值

java 复制代码
void select_sort(vector<int>& arr) {
    int l = 0, r = arr.size() - 1;
    while (l < r) {
        int minIndex = l, maxIndex = r;
        for (int i = l; i <= r; i++) {
            if (arr[i] < arr[minIndex]) minIndex = i;
            if (arr[i] > arr[maxIndex]) maxIndex = i;
        }
        swap(arr[l], arr[minIndex]);
        if (maxIndex == l) swap(arr[r], arr[minIndex]);
        else swap(arr[maxIndex], r);
        l++, r--;
    }
}
复制代码
public static void selectSort(int[] arr) {
    int l = 0, r = arr.length - 1;
    while (l < r) {
        int minIndex = l, maxIndex = r;
        for (int i = l; i <= r; i++) {
            if (arr[i] > arr[maxIndex]) {
                maxIndex = i;
            }
            if (arr[i] < arr[minIndex]) {
                minIndex = i;
            }
        }
        swap(arr, l, minIndex);
        if (maxIndex == l) maxIndex = minIndex;
        swap(arr, r, maxIndex);
        l++;
        r--;
    }
}
相关推荐
Rubisco..28 分钟前
牛客周赛 Round 111
数据结构·c++·算法
兮山与33 分钟前
算法8.0
算法
高山上有一只小老虎37 分钟前
杨辉三角的变形
java·算法
Swift社区43 分钟前
LeetCode 395 - 至少有 K 个重复字符的最长子串
算法·leetcode·职场和发展
hz_zhangrl1 小时前
CCF-GESP 等级考试 2025年9月认证C++四级真题解析
开发语言·c++·算法·程序设计·gesp·c++四级·gesp2025年9月
代码小菜鸡6661 小时前
java 常用的一些数据结构
java·数据结构·python
火山灿火山1 小时前
详解AVL树旋转操作实现
数据结构·c++
少许极端1 小时前
算法奇妙屋(六)-哈希表
java·数据结构·算法·哈希算法·散列表·排序
羊羊小栈1 小时前
基于「多模态大模型 + BGE向量检索增强RAG」的新能源汽车故障诊断智能问答系统(vue+flask+AI算法)
vue.js·人工智能·算法·flask·汽车·毕业设计·大作业
Da Da 泓1 小时前
shellSort
java·数据结构·学习·算法·排序算法