C语言的选择排序

2023-01-10 14:25:47

选择排序

问题描述

从键盘输入N个自然数 并对其进行选择排序 排序方式为升序 

问题分析

扫描整个线性表 ,第一轮 :
我们把第一个元素和前一个相比 如果第一个大于前面的一个就进行交换得到新位置的第一个,继续和前一个比较 循环 直到到第一轮元素的最后

第二轮就从第二个元素开始 和前一个比较 第三轮就是从第三个元素和前一个比较 … 直到轮次结束。

动图演示
在这里插入图片描述

1 拿第一轮来说: 找到的前一个元素集合中比第一个元素小的 
都会被锁定为红色 并且 第一个元素会 和前一个集合中的最小元素交换。

{2}

2 如果 扫描完一轮都没有符号要求的 他就会直接进入第二轮了

在这里插入图片描述
可能大家 还有点 疑问 我那上面的图来解析一下

第一轮:第一个元素(5)。(第一个大于前一个)5>3>2>1(也就是只有321符合)也就对应了我上面说的前一个集合  那么5就和1交换 
第二轮:第二个元素(8)。(第二个大于前一个)8>7>6>3>2)
没有1 的原因因为他已经被选中了并且交换完成了。 所以 82 交换 
后面的轮次也是一样的思路。
往回看看动态图
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);
}

`输入
在这里插入图片描述
输出 结果
在这里插入图片描述

不服 来 哞 !
  • 作者:无为则无所不为
  • 原文链接:https://blog.csdn.net/weixin_59349642/article/details/123935027
    更新时间:2023-01-10 14:25:47