C语言成长之路44:选择排序法(上)

声明:本笔记基于 B站UP主「来自程序员的暴击」的 「C语言成长之路」中对应课程;


 

1、选择排序法

原理:

在列表中从头0下表扫描到最后一个下表的元素,找出最大(最小)的一个元素后,和第一个元素交换,接着从剩下的元素中继续通过这种方式找出最大(最小)值后,和第X个元素交换,直到整个过程完毕;

 

代码:

 1 #include <stdio.h>
 2 
 3 void selectionSor(){
 4     printf("please enter 10 num to test \n");
 5     int a[10];
 6     for (int i = 0;i < 10;i++){
 7         scanf("%d",&a[i]);              //  循环获取用户输入
 8     }
 9     for (int i = 0;i < 10 - 1;i++){
10         int max = i;
11         for (int j = i + 1;j < 10;j++){
12             if (a[max] < a[j]){         //  第一次循环时,max = 0;a[max]为第一个输入的数,i的值为0,所以j = 1
13                 int temp_num = a[j];    //  生成一个临时变量存放a[j]的值,用于接下来的替换做准备
14                 a[j] = a[max];          //  把a[j]的值赋给a[max],用于接下来的替换做准备
15                 a[max] = temp_num;      //  由于temp_num = a[j],a[j] = a[max],此时重新把旧的a[j]即现在的temp_num的值赋给a[max],完成变量互换
16             }
17         }
18     }
19     for (int i = 0;i < 10;i++){
20         printf("%4d",a[i]);
21     }
22     printf("\n");
23 }
24 
25 void main(){
26     /*  C语言成长之路44:选择排序法(上)  */
27     selectionSor();
28 };

过程思考:

假设输入的值为 {1,2,3,4,5,6,7,8,9,0}

第一次循环时,i = 0,max = 0 ,j = 0 + 1,判断:a[0] < a[1],则调换a[0]和a[1]的位置;

before: 1 2 3 4 5 6 7 8 9 0

after:   2 1 3 4 5 6 7 8 9 0

 

第二次循环时,i = 0,max = 0,j = 1 + 1,判断 a[0] < a[2],则调换a[2]和a[0]的位置;

before:2 1 3 4 5 6 7 8 9 0

after:  3 1 2 4 5 6 7 8 9 0

 

第三次循环时,i = 0,max = 0,j = 2 + 1,判断a[0] < a[3],则调换a[3]和a[0]的位置;

before:3 1 2 4 5 6 7 8 9 0

after:  4 1 2 3 5 6 7 8 9 0

 

第四次循环时,i = max = 0;j = 3 + 1,判断a[0] < a[4],则调换a[4]和a[0]的位置;

before:4 1 2 3 5 6 7 8 9 0

after:5 1 2 3 4 6 7 8 9 0

 

一直这么循环下去,直到找出最大值 9,最后第一次所有循环结束的结果为:

9 1 2 3 4 5 6 7 8 0

 

接着进行第二次大循环,此时i = 1;max = 1;所以数组a的下标是从a[1]开始,即第二个,然后又开始了上述的循环,一直循环找到最大值,直到列表完成了排序,最终结果:

9 8 7 6 5 4 3 2 1 0

posted @ 2020-08-08 10:22  Akne  阅读(132)  评论(0编辑  收藏  举报