数据排序——选择排序
1.选择排序
基本思想:
每一趟从待排序的数据元素中挑选出最小(或者最大)的一个元素,顺序放在待排序数列的最前,直到全部待排序的数据元素排完。
排序过程:
初始排序结果 [49 38 65 97 76 13 27 49]
第一趟排序后 13 [38 65 97 76 49 27 49]
第二趟排序后 13 27 [65 97 76 49 38 49]
第三趟排序后 13 27 38 [97 76 49 65 49]
第四趟排序后 13 27 38 49 [76 97 65 49]
第五趟排序后 13 27 38 49 49 [97 65 76]
第六趟排序后 13 27 38 49 49 65 [97 76]
第七趟排序后 13 27 38 49 49 65 76 [97]
最后排序结果 13 27 38 49 49 65 76 97[]
2.例题
【题目描述】:
输入 n
个数,将 n
个数按从小到大的顺序输出 (n<=10000)
。
输入样例:
8
49 38 65 97 76 13 27 49
输出样例:
13 27 38 49 49 65 76 97
【归纳上述排序过程,具体实现步骤如下】:
①读入数据存放在 a
数组中。
②在 a[1]~a[n]
中选择值最小的元素,与第 1
位置元素交换,则把最小值元素放入 a[1]
中。
③在 a[2]~a[n]
中选择值最小的元素,与第 2
位置元素交换,则把最小值元素放入 a[2]
中,……
④直到第 n-1
个元素与第 n
个元素比较排序为止。
程序实现方法:用两层循环完成算法,外层循环 i
控制当前序列最小值存放的数组位置,内层循环 j
控制从 i+1
到 n
序列中选择最小的元素所在位置 k
。
【c++程序如下】:
#include<bits/stdc++.h>
using namespace std;
int a[10005];
int n,k,temp;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
k=i; //当前最小元素的位置,每次从i开始
for(int j=i+1;j<=n;j++){
if(a[j]<a[k]) k=j; //更新位置
}
if(k!=i){ //如果k值有变化,则交换
temp=a[k];
a[k]=a[i];
a[i]=temp;
}
}
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
return 0;
}
个人学习分享,欢迎指正!