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