简单选择排序算法(C语言版)

题目:

[编程入门]选择排序 - C语言网 (dotcpp.com)

算法分析:

1.我们设置两个记录i和j,i自数组第一个元素开始,j自i+1个元素开始。其中i是控制外层的趟数,j是控制内层对比的次数。

2.接着j遍历整个数组,如果选出了一个比当前数大的较小值,则更新较小值,直到选出整个数组最小的值,并让这个最小的值和i的位置交换(在第一趟中假设数组第一个数是最小值也就是arr[0]在当前循环中就是arr[i],如果i选择的元素是最小的则不需要交换),我们称这个过程为一趟选择排序。

3.i选中下一个元素(i++),在下一趟中arr[0]不用参加排序,从arr[1]开始即可。重复进行每一趟选择排序。

4.持续上述步骤,使得i到达n-1处,即完成排序 。

图示示例:

第一趟2就是需要比较的数,往后遍历发现1比2小二者交换,然后从10开始往后遍历发现2比10小二者交换以此类推。直到最后一趟9比10小不用交换,因此外层控制趟数的i就是n-1次,内层j因为每次都要以此往后遍历n次寻找小的数。

代码:

每一趟从待排序的数据元素中选出最小的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完,我们只需要进行n-1趟排序即可,因为最后剩下的一个数据一定是整体数据中最大的数据。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

// 选择排序
int main() {
    int arr[100];
    int n;
    
    // 输入数组长度
    scanf("%d", &n);

    // 读取数组元素
    int i;
    for (i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    // 选择排序
    for (i = 0; i < n - 1; i++) {
        int j, min = i;
        
        // 找到未排序部分的最小元素
        for (j = i + 1; j < n; j++) {
            if (arr[min] > arr[j]) {
                min = j;
            }
        }

        // 交换元素
        if (min != i) {
            int temp = arr[i];
            arr[i] = arr[min];
            arr[min] = temp;
        }
    }

    // 打印排序后的数组
    for (i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

样例输入

10(是10个数据)

4 85 3 234 45 345 345 122 30 12

样例输出

复杂度与稳定性

算法时间复杂度

最坏情况:O(n^2)

最好情况:O(1)(即不需要排序,本身已是正序)

平均情况:O(n^2)

空间复杂度:S(n)=O(1)

稳定性:不稳定排序

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值