目录
基本思想
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在待排序的数列的最前端,直到所有元素排完。
排序过程
初始关键字:【3 1 5 4 2】
第一趟排序后:1【3 5 4 2】
第二趟排序后:1 2【5 4 3】
第三趟排序后:1 2 3【4 5】
最终结果:1 2 3 4 5
例题(选择排序)
时间复杂度:O(n²)
题目描述
输入n个正整数,然后把这n个数按由小到大的顺序输出。(要求用选择排序)
n<=1000,所有数据在longint范围内。
输入
第一行输入n
第二行输入n个正整数
输出
把这n个数按由小到大的顺序输出(相邻数用空格隔开)
样例输入
4 4 1 2 3
样例输出
1 2 3 4
根据选择排序的方法,具体步骤如下:
【1】读入数据并存放在a数组中。
【2】在a[1]~a[n]中选择值最小的元素,与第一位置元素交换。
【3】在a[2]~a[n]中选择值最小的元素,与第二位置元素交换。
……
【4】直到第n-1个元素与第n个元素比较排序为止。
程序实现方法
用两重循环完成算法,外层循环控制当前序列最小值存放的数组位置,内层循环控制选择最小值的位置。
代码
#include <bits/stdc++.h>
using namespace std;
int a[10001];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];//读入
}
for(int i=1;i<=n-1;i++)//
{
long long min1=1e18,index=i;//最小值(min1)及最小值的位置(index)
for(int j=i;j<=n;j++)
{
if(a[j]<min1)//若当前数据小于最小值
{
min1=a[j];//记录最小值
index=j;//记录位置
}
}
swap(a[i],a[index]);//交换
}
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";//输出
}
}