大家好,又见面了,我是你们的朋友全栈君。
选择排序是在每一轮比较中不是每当a[i]<a[j]时候就交换,而是用一个变量k记下其中较小的元素的下标值,在a[i]与a[i+1]~a[n]全部进行比较后,只将a[i]与a[i+1] ~ a[n]中最小的值进行交换,为此每一轮只需要将a[i]与a[k]的值进行交换即可。
设有n个数据存储到从a[0]~ a[n+1]的n个数组元素中,则选择排序过程分为如下n-1步骤:
第一步:在第1~n个数中找出最小者,然后与第一个数进行比较,前1个数排好序
第二步:在第2~n个数中找出最小者,然后与第二个数进行交换,前2个数排好序
…
第n-1步:在第n-1 ~ n个数中找出最小者,然后与第n-1个数进行交换,排序结束
算法分析:
n个待排序的数据分别存放在一维数组中,外层循环是次数循环,循环控制变量i依次取值0~ n-2,对应第1步~ 第n-1步。循环体是在a[i] ~ a[n-1]中寻找最小的值及其下标,找到后与a[i]交换。
代码如下:
#include <stdio.h>
void main(){
int i,j,k,n,temp,a[200];
printf("请输入需要排序的数据个数\n");
scanf("%d",&n);// 从键盘输入待排序的数据个数
for(i=0;i<n;i++){
// 利用for循环依次将输入的数据放置在数组中
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++){
// 外层循环 变量i控制排序总共进行n-1轮
k=i;
for(j=i+1;j<n;j++){
//内层循环 变量j控制每轮进行比较的次数
if(a[j]<a[k]){
k=j; //k记录每轮比较中的最小者的下标
if(k!=i){
//将第i轮的最小者,与a[i]交换
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
}
}
}
printf("排序后的数据如下:\n");
for(i=0;i<n;i++){
// 利用for循环进行输出
printf("%d\t",a[i]);
}
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/153031.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...