排序算法介绍(三)选择排序

0. 简介

        选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法。


1. 选择排序的实现

选择排序的基本思想:

  1. 在未排序的序列中找到最小(或最大)的元素,存放到排序序列的起始位置。
  2. 再从剩余未排序的元素中继续寻找最小(或最大)的元素,然后放到已排序的序列的末尾。
  3. 以此类推,直到所有元素均排序完毕。

选择排序过程演示:

c1ebf29cabe543548493dcf5dc6e6164.gif

 


2. 选择排序时空间复杂度分析

选择排序的时间复杂度和空间复杂度如下:

  1. 时间复杂度:

    • 无论数据状况如何,选择排序都需要进行 n-1 趟选择,每趟选择都需要进行 n-i 次比较(i 是当前趟数),所以总的时间复杂度是 O(n^2)。
  2. 空间复杂度:

    • 选择排序是原地排序,只需要一个额外空间用于临时交换元素,所以空间复杂度是 O(1)。

总结:选择排序的时间复杂度是 O(n^2),空间复杂度是 O(1)。


3. 选择排序C语言代码

C代码实现:

#include <stdio.h>  
  
void selectionSort(int arr[], int n) {  
    int i, j, minIndex, temp;  
    for (i = 0; i < n-1; i++) {  // 外层循环控制选择的趟数  
        minIndex = i;            // 记录最小值的索引,初始化为当前趟的起始位置  
        for (j = i+1; j < n; j++) {  // 内层循环在未排序的元素中查找最小值  
            if (arr[j] < arr[minIndex]) {  
                minIndex = j;  // 更新最小值的索引  
            }  
        }  
        // 交换找到的最小值与当前趟的起始位置的值  
        temp = arr[minIndex];  
        arr[minIndex] = arr[i];  
        arr[i] = temp;  
    }  
}  
  
int main() {  
    int arr[] = {64, 34, 25, 12, 22, 11, 90};  // 待排序的数组  
    int n = sizeof(arr)/sizeof(arr[0]);      // 数组的长度  
    selectionSort(arr, n);                   // 对数组进行选择排序  
    printf("Sorted array: \n");  
    for (int i=0; i < n; i++) {              // 输出排序后的数组  
        printf("%d ", arr[i]);  
    }  
    printf("\n");  
    return 0;  
}

代码解释:

  • selectionSort 函数接收一个整数数组和它的长度作为参数。
  • 外层循环负责保证选择的趟数。例如,有7个数字,就需要选择6趟。
  • 内层循环负责在未排序的元素中查找最小值。minIndex 用于记录当前找到的最小值的索引,初始化为当前趟的起始位置。如果发现有更小的数,就更新 minIndex
  • 内层循环结束后,我们已经找到了当前未排序部分的最小值,然后将其与当前趟的起始位置的值进行交换。这样,当前趟的起始位置就有了正确的值。
  • 外层循环继续进行,直到所有元素都排好序。

4. 选择排序代码运行结果

代码运行结果:

ea1480431dc246e0a2003d41e45f2b2d.png

 

相关推荐

  1. 排序算法——选择排序

    2023-12-07 16:30:04       40 阅读
  2. 排序算法-选择排序

    2023-12-07 16:30:04       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 16:30:04       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 16:30:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 16:30:04       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 16:30:04       20 阅读

热门阅读

  1. 【开源存储】OpenZFS文件系统部署实践

    2023-12-07 16:30:04       42 阅读
  2. 8. 队列

    8. 队列

    2023-12-07 16:30:04      42 阅读
  3. vue3学习网站

    2023-12-07 16:30:04       44 阅读
  4. Elasticsearch-Kibana使用教程

    2023-12-07 16:30:04       29 阅读
  5. Android Audio实战——音频焦点监听(十)

    2023-12-07 16:30:04       39 阅读
  6. mysql基本命令

    2023-12-07 16:30:04       37 阅读
  7. vue3 element-plus 将路由和激活菜单绑定

    2023-12-07 16:30:04       38 阅读
  8. 传导电流密度方向与磁矢位方向相同

    2023-12-07 16:30:04       25 阅读
  9. 【FPGA图像处理实战】- 彩色图像灰度化

    2023-12-07 16:30:04       40 阅读
  10. TCP Socket API 讲解,以及回显服务器客户端的实现

    2023-12-07 16:30:04       24 阅读