排序算法:选择排序法

文章目录

一、选择排序简介

  选择排序(Selection Sort)是一种简单直观的排序算法,其基本思想是:每一轮从待排序的元素中选择最小(或最大)的元素,将其与未排序部分的第一个元素交换位置。通过这样的交换,逐渐将整个数组排好序。

选择排序的基本思想

  1. 每一轮选择最小(或最大)元素:在未排序的部分中找到最小(或最大)元素。
  2. 与当前元素交换:将找到的最小(或最大)元素与未排序部分的第一个元素交换。
  3. 重复过程:逐步缩小未排序的部分,直到所有元素排好顺序。

二、选择排序演示排序过程

假设我们有一个数组 arr = 64, 25, 12, 22, 11,我们将通过几轮排序过程来展示选择排序的工作原理。
初始数组:

cpp 复制代码
[64, 25, 12, 22, 11]

第一次遍历:

寻找数组中最小的元素 11,将 11 与第一个元素 64 交换,得到:

cpp 复制代码
[11, 25, 12, 22, 64]

第二次遍历:

从剩下的部分 25, 12, 22, 64 中,找到最小的元素 12,将 12 与第二个元素 25 交换,得到:

cpp 复制代码
[11, 12, 25, 22, 64]

第三次遍历:

从剩下的部分 25, 22, 64 中,找到最小的元素 22,将 22 与第三个元素 25 交换,得到:

cpp 复制代码
[11, 12, 22, 25, 64]

第四次遍历:

从剩下的部分 25, 64 中,找到最小的元素 25,它已经在正确的位置,不需要交换。

cpp 复制代码
[11, 12, 22, 25, 64]

最终排序结果:

cpp 复制代码
[11, 12, 22, 25, 64]

三、选择排序的时间复杂度分析

1. 最坏情况时间复杂度:O(n²)

不论输入数组的顺序如何,选择排序总是需要执行 n-1 次比较,第一个元素需要与其余 n-1 个元素比较,第二个元素与剩下的 n-2 个元素比较,依此类推。因此,总比较次数为:

2.最好情况时间复杂度:O(n²)

选择排序在任何情况下都要进行相同数量的比较,所以即使数组是有序的,仍然需要执行 O(n²) 的比较。

3.空间复杂度:O(1)

选择排序是原地排序算法,只需要常数级的额外空间来进行交换,因此空间复杂度为 O(1)。

选择排序的优缺点:
优点:

  1. 简单直观:算法易于理解和实现。
  2. 空间复杂度低:不需要额外的存储空间,仅使用常数空间进行排序。
  3. 稳定性:虽然选择排序是原地排序算法,但它本身并不是稳定的。若要使其稳定,可以在交换前进行适当的调整。

缺点:

  1. 时间复杂度较高:选择排序的最坏时间复杂度为 O(n²),对于大规模数据排序效率较低。
  2. 较慢:尽管它比冒泡排序少进行一些交换,但总的时间复杂度仍然是 O(n²),因此对于大数据集,通常不如其他排序算法(如快速排序、归并排序)高效。

选择排序的应用场景:

由于选择排序的时间复杂度为 O(n²),在数据量较小的情况下它可以表现得还不错,尤其是其实现简单且对空间的需求非常低。

  • 数据量小的情况:例如,数组元素较少时,选择排序可以提供不错的性能
  • 内存限制:由于选择排序是原地排序,它在内存受限的情况下非常合适。
  • 不需要稳定性:选择排序通常用于不关心元素相对顺序的场景(例如,排序数字)。

四、选择排序的代码实现

cpp 复制代码
#include <iostream>
using namespace std;

void selectionSort(int arr[], int n) {
    for (int i = 0; i < n-1; i++) {
        // 假设当前未排序部分的第一个元素是最小值
        int minIndex = i;
        for (int j = i + 1; j < n; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;  // 更新最小值的索引
            }
        }
        // 如果最小值不是当前元素,则交换
        if (minIndex != i) {
            int temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }
}

int main() {
    int arr[] = {64, 25, 12, 22, 11};
    int n = sizeof(arr) / sizeof(arr[0]);

    selectionSort(arr, n);

    cout << "Sorted array: ";
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;

    return 0;
}
相关推荐
Lewiis16 小时前
白话桶排序
数据结构·算法·golang·排序算法
孬甭_19 小时前
深入剖析快速排序:原理、实现与性能优化
数据结构·算法·排序算法
nice_lcj52020 小时前
排序(2)-选择排序专题——简单选择排序与堆排序的结构优化
数据结构·算法·排序算法
nice_lcj52020 小时前
排序(4)-归并排序专题——归并排序的分治美学
java·数据结构·算法·排序算法
nice_lcj52020 小时前
排序(3)-第三篇:交换排序专题——从冒泡排序到快速排序的效率飞跃
java·数据结构·算法·排序算法
江屿风2 天前
C++图论基础拓扑排序算法流食般投喂
开发语言·c++·笔记·算法·排序算法
用户484526255823 天前
数组分区和荷兰国旗只差一个条件:稳定性
排序算法
HZ·湘怡3 天前
数据结构之排序算法 (1)--插入排序
c语言·数据结构·算法·排序算法
hnjzsyjyj4 天前
东方博宜OJ 1010:数组元素的排序 ← 桶排序
数据结构·排序算法·桶排序
孬甭_4 天前
从基础到优化:深入理解插入排序与希尔排序
数据结构·算法·排序算法