选择排序超详细讲解C语言


选择排序是一种简单直观的排序算法,无论数据是否有序,该排序的时间复杂度恒为 O ( N 2 ) O(N^{2}) O(N2),所以用该排序时,数据量越小越好。

算法步骤

首先在未排序序列中找到最小的(升序)元素,放在未排序序列的起始位置,然后再从剩下的未排序序列中找到最小的(升序)元素,放在未排序序列的起始位置,以此类推。

动图演示

img

静图演示

image-20220828153009022

代码实现

普通

void SelectSort(int* a, int n){
    for(int i = 0; i < n - 1; i++){
      	//在未排序序列中找最小的元素
        int minIndex = i;
        for(int j = i + 1; j < n; j++){
            if(a[minIndex] > a[j]){
                minIndex = j;//minIndex始终是最小元素的下标
            }
        }
        Swap(&a[minIndex], &a[i]);//将最小元素和首元素交换
    }
}

升级

上面的是每次循环只找一个最小的,将最小的放首位后,序列向右收缩;

而现在的升级版本是每次循环找一个最小的和一个最大的,将最小的放首位,最大的放末位,序列向中间收缩。

然后

void SelectSort(int* a, int n){
    int left = 0;
    int right = n - 1;
    while(left < right){
        int minIndex = left;
        int maxIndex = left;
        for(int i = left + 1; i <= right; i++){
            if(a[minIndex] > a[i]){
                minIndex = i;
            }
            if(a[maxIndex < a[i]]){
                maxIndex = i;
            }
        }
        Swap(&a[minIndex], &a[left]);
        if(maxIndex == left){
            maxIndex = minIndex;
        }
        Swap(&a[maxIndex], &a[right]);
        left++;
        right--;
    }
}

复杂度、稳定性分析

  1. 时间复杂度

    假设有N个数据

    不论数据是否有序,在排第1个数据时必定会比较N-1次,排第2个数据时必定会比较N-2次,所以总的比较次数为 1 + 2 + 3 + . . . + ( N − 1 ) 1 + 2 + 3+...+(N-1) 1+2+3+...+(N1),等差数列求和,结果为 N 2 / 2 N^{2}/2 N2/2时间复杂度为 O ( N 2 ) O(N^{2}) O(N2)

  2. 空间复杂度

    仅仅使用了常数个辅助单元,空间复杂度是O(1);

  3. 稳定性

    举个例子,序列6 8 6 2 7, 第一遍选择,第一个6会和2交换,那么原序列中2个6的相对前后顺序就被破坏了,

    所以是不稳定的

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云朵c

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值