hnust 1816: 算法10-9:简单选择排序

hnust 1816: 算法10-9:简单选择排序

题目描述
选择排序的基本思想是:每一趟比较过程中,在n-i+1(i=1,2,…,n-1)个记录中选取关键字最小的记录作为有序序列中的第i个记录。
在多种选择排序中,最常用且形式最为简单的是简单选择排序。
简单选择排序的算法可以描述如下:
在这里插入图片描述

在本题中,读入一串整数,将其使用以上描述的简单选择排序的方法从小到大排序,并输出。

输入
输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过1000。
第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。
输出
只有1行,包含n个整数,表示从小到大排序完毕的所有整数。
请在每个整数后输出一个空格,并请注意行尾输出换行。
样例输入 Copy
10
2 8 4 6 1 10 7 3 5 9
样例输出 Copy
1 2 3 4 5 6 7 8 9 10
提示
在本题中,需要按照题目描述中的算法完成简单选择排序的算法。
简单选择排序是一种思路非常简单,结构简洁的排序算法。它的特点是,无论记录的初始排列形式如何,所需进行的关键字间的比较次数始终相同,均为n(n-1)/2。因此,其时间复杂度也固定在O(n2)。

解题过程

这段代码实现了选择排序(Selection Sort)算法,选择排序是一种简单直观的排序算法,其工作原理是每次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序数据元素排完。以下是对代码的详细解析:

  1. 函数定义

    • selectSort(int a[], int len):这是选择排序的函数,接收一个整数数组 a 和数组的长度 len 作为参数。
  2. 外层循环

    • for(int i = 0; i < len - 1; i++):外层循环控制排序过程中已排序元素的索引,从0开始,直到倒数第二个元素。
  3. 选择最小元素

    • int p = i;:初始化一个变量 p 作为当前轮次中已找到的最小元素的索引。
  4. 内层循环

    • for(int j = i + 1; j < len; ++j):内层循环从 i + 1 开始,遍历当前未排序的部分,寻找最小元素。
  5. 更新最小元素索引

    • if(a[j] < a[p]) p = j;:如果在内层循环中找到一个比当前最小元素 a[p] 更小的元素 a[j],则更新 pj
  6. 交换元素

    • swap(a[i], a[p]);:内层循环结束后,将找到的最小元素 a[p] 与当前轮次的第一个元素 a[i] 交换位置。
  7. swap 函数

    • 代码中没有给出 swap 函数的实现,但它应该是一个交换两个数组元素的函数。
  8. 算法性能

    • 选择排序的时间复杂度是 O(n^2),其中 n 是数组的长度。这是因为算法需要进行两层循环,内层循环在最坏情况下会遍历所有剩余的元素。
  9. 稳定性

    • 选择排序是稳定的排序算法,因为它不会改变相同元素之间的顺序。
  10. 适用场景

    • 选择排序适用于数据量较小或者数据基本有序的情况,此时它的效率相对较高。

选择排序是一种基础的排序算法,由于其实现简单,它在实际编程中仍然有着广泛的应用。然而,对于大规模数据集,更高效的排序算法(如快速排序、归并排序等)可能是更好的选择。


AC代码

#include <bits/stdc++.h>
using namespace std;
 
int a[1010];
void selectSort(int a[], int len){
    for(int i = 0;i < len - 1;i++){
        int p = i;
        for(int j = i + 1;j < len;++j) if(a[j] < a[p]) p=j;
        swap(a[i], a[p]);
    }
}
int main(){
    int n;
    cin >> n;
    for(int i = 0;i < n;i++) cin >> a[i]; 
    selectSort(a, n);
    for(int i = 0;i < n;i ++) cout << a[i] << ' ';
    return 0;
}
  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值