#C语言#对选择排序的一点理解

题目:在键盘上输入n个整数,将他们按照从大到小的次序排序后输出。要求采用选择排序法。

选择排序的两种算法(个人的理解):

第一种-------先找到最大值再交换

#include<stdio.h>
/大到小选择排序 --先找到这些数据里面的最大值,(用下标更新最大值)
判断整个最大值是否等于第i个数,不等于就交换–大到小
/
int main()
{
int a[500]={0}; //定义一个储存数据的数组
int i,j,k,n,temp;
printf(“即将在键盘上输入整数的个数:\n”);
scanf("%d",&n);
printf(“输入%d个整数:\n”,n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++) //外循环,i就是内循环里的最大值应该放的位置i
{
k=i; //假设第i个数就是最大值,记下下标,方便后面找到真正的最大值
for(j=i+1;j<n;j++) /内循环,从a[i]的后一个数开始
每个数都要和前一个最大值比较一次,找到真正的最大值
/
{
if(a[j]>a[k])
{
k=j;//更新记录下的最大值
}
}
if(k!=i) //如果找到的最大值和i不是同一个数,就交换
{
temp=a[i];
a[i]=a[k];//把最大值放到i的位置
a[k]=temp;//原来a[i]上面的数据一定不可以丢掉,必须放回a[k]里面,让它能够继续参与比较
}
}
for(i=0;i<n;i++) //最后输出即可
{
printf("%d ",a[i]);
}
return 0;
}

第二种-----一边比较一边交换

#include<stdio.h>
/大到小选择排序 --边比较边交换/
/先用外循环固定一个位置i,然后和内循环的a[j]比较,边比较边交换/
int main()
{
int a[500]={0};//定义一个储存数据的数组
int i,j,k,n,temp;
printf(“即将在键盘上输入整数的个数:\n”);
scanf("%d",&n);
printf(“输入%d个整数:\n”,n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++) //注意循环条件是i<n-1,最后一个数字不用排序
{
for(j=i+1;j<n;j++) //a[i]后面所有的数都要和a[i]比较
{
if(a[j]>a[i]) //如果a[j]>a[i]就交换
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
printf(“选择排序,从大到小:\n”);
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
return 0;
}

上面就是我对选择排序的两种方法的理解啦!欢迎交流!

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试
应支付0元
点击重新获取
扫码支付

支付成功即可阅读