问题描述
从键盘输入N个自然数 并对其进行选择排序 排序方式为升序
问题分析
扫描整个线性表 ,第一轮 :
我们把第一个元素和前一个相比 如果第一个大于前面的一个就进行交换得到新位置的第一个,继续和前一个比较 循环 直到到第一轮元素的最后
第二轮就从第二个元素开始 和前一个比较 第三轮就是从第三个元素和前一个比较 … 直到轮次结束。
动图演示
1 拿第一轮来说: 找到的前一个元素集合中比第一个元素小的
都会被锁定为红色 并且 第一个元素会 和前一个集合中的最小元素交换。
{2}
2 如果 扫描完一轮都没有符号要求的 他就会直接进入第二轮了
可能大家 还有点 疑问 我那上面的图来解析一下
第一轮:第一个元素(5)。(第一个大于前一个)(5>3>2>1)
(也就是只有321符合)也就对应了我上面说的前一个集合 那么5就和1交换
第二轮:第二个元素(8)。(第二个大于前一个)(8>7>6>3>2)
没有1 的原因因为他已经被选中了并且交换完成了。 所以 8和 2 交换
后面的轮次也是一样的思路。
往回看看动态图
void scan(int arr[],int len)//键盘输入函数
{
int i;
for(i=0;i<len;i++)
{
scanf("%d",arr+i);//输入
}
}
void MaoPao(int arr[],int len)
{
int i,j;
int temp;
for(i=0;i<len-1;i++)//轮次
{
for(j=i+1;j<len;j++)//一轮的次数
{
if(arr[i]>arr[j])//如果前一个小于第一个元素 (拿第一轮举例)
{
temp=arr[i]; // 前一个集合都比第一个小的 在前一个集合中选出最小的
arr[i]=arr[j];//和第一个元素交换
arr[j]=temp;
}
}
}
return temp;
}
void print(int arr[],int len)//函数输出
{
int a;
for(a=0;a<len;a++)
{
printf(" %d",*(arr+a)); //arr就是数组的首地址
}
}
void main()
{
int arr[5];
int len=sizeof(arr)/sizeof(arr[0]);//计算数组长度
scan(arr,len);//函数调用
MaoPao(arr,len);
print(arr,len);
}
`输入
输出 结果
不服 来 哞 !