超详细的选择排序讲解-C语言

一、选择排序的思想

        在一组数据中我们需要找到最小的数,然后将最小的数放在首位,从第二位起我们继续在整组数据中寻找最小的数,如果找到最小的数据,我将之与第二位交换,然后从第三位依次往后寻找最小的数,寻找到后和第三位进行交换。

二、示意图与具体步骤

具体步骤:

例:假如我们将一组数据1 3 2 5 0,我们将此组数据进行选择排序。

1.我们首先将第一个数'1'与整族数据中的3,2,5,0,依次进行比较,在比较过程中我们发现'0'比'1'小,所以我们将0与1进行交换,可得到如下数据:

2.此时我们已经将整组数据进行比较后,并且将最小值交换到首位,此时第一位我们已经可以确定了,我们继续使用上方方法,进行查找第二位的最小值:

3.在此轮进行比较时,我们发现一个问题就是比'3'小的数有两个,在我第一次进行比较时遇到的数字'2'就比数字'3'小,按照上述步骤我们应该将'2'与‘3’进行交换,但是在此处显然行不通,因为你将'2'与'3'交换后,按照思路,'3'继续与剩余的数据进行比较,发现有比'3'小的数据,再次与'3'进行交换,但是此时'3'的位置已经不在'2'的位置上了,并且你也无法确定,此时比'3'小的数是否也比'2'小,这些是我们无法确定的,同时假如一组很长很复杂的数据我们也无法确定里面到底哪个是最小的数。

所以我们要想解决办法,既然不能确定它最小,那我就不能交换,那我是不是可以设置一个中间量,假如我们设置的中间量为temp,这时把我们这个比'3'小的数'2'存入里面,如下:

                                        temp=2;                                      

然后使用这个中间量temp里面储存的'2'去和剩余的数据进行比较,如果发现比'2'小的,我们再将这个数存入到中间量里面,假如发现一个最小的数n:

                                        temp=n;

然后我们使用temp继续和剩下的数据进行比较,依此循环,最后我们找到的最小的数就是存到中间量内;

                                        temp=最小的值;

此时3的位置还是在第二位,所以我们只需要将temp内的数字与‘3’交换位置即可,如下图:

最后我们只需要将此部分想利用循环形式的将每一个数据都进行比较即可,接下来说就是利用数组将此编写出来。

三、源码

  1 #include <stdio.h>
  2 
  3 int swap(int *x,int*y)
  4 {
  5     int temp;
  6     temp=*y;
  7     *y=*x;
  8     *x=temp;
  9 }
 10 int sort(int arr[],int x)
 11 {
 12     int min;
 13     for(int i=0;i<x-1;i++){
 14         min=i;
 15         for(int j=i+1;j<x;j++){
 16             if(arr[min]>arr[j]){
 17                 min=j;
 18             }
 19         }
 20         swap(&arr[min],&arr[i]);
 21     }
 22 }
 23 int main()
 24 {
 25     int n;
 26     printf("请输入要排序的个数:");
 27     scanf("%d",&n);
 28     int a[n];
 29     printf("请输入要排序的数字:");
 30     for(int i=0;i<n;i++){
 31         scanf("%d",&a[i]);
 32     }
 33     sort(a,n);
 34     for(int i=0;i<n;i++){
 35         printf("%d ",a[i]);
 36     }
 37     printf("\n");
 38     return 0;
 39 }
~                                                                                    
~         

说明;此代码编写时也使用了数组、函数的相关知识,整体思想都是按照选择排序进行的。

四、运行结果

五、结语

希望对正在学选择排序的你,有帮助!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值