“选择排序法” 基本原理
将要排序的对象中每次选择一个值,按照非递减(从小到大)(或非递增(从大到小))顺序进行排列,每经过一次排序,要排序对象便会分为一个待排序部分和已排序部分。之后,进行相同的过程,直至顺序排列完成。
如下所示:
排序前:70 80 31 37 10 1 48 60 33 80
第1步:[1] 80 31 37 10 70 48 60 33 80 最小值1
第2步:[1 10] 31 37 80 70 48 60 33 80 最小值10
第3步:[1 10 31] 37 80 70 48 60 33 80 最小值31
第4步:[1 10 31 33] 80 70 48 60 37 80 最小值33
第5步:[1 10 31 33 37] 70 48 60 80 80 最小值37
第6步:[1 10 31 33 37 48] 70 60 80 80 最小值48
第7步:[1 10 31 33 37 48 60] 70 80 80 最小值60
第8步:[1 10 31 33 37 48 60 70] 80 80 最小值70
第9步:[1 10 31 33 37 48 60 70 80] 80 最小值80
最后一个值为80,无法再进行,排序完成。
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 10
#define SWAP(x,y) {int t; t = x; x = y; y = t;}//借助宏定义实现元素交换,可以修改为函数
void selsort(int number[]){
int i, j, k, m;
for(i = 0; i < MAX-1; i++){
m = i;
for(j = i+1; j < MAX; j++){
if(number[j] < number[m]){
m = j;
}
}
if( i != m){
//此处可以将SWAP宏定义中的交换修改为元素在内部交换
SWAP(number[i], number[m]);
}
printf("第 %d 次排序:", i+1);
for(k = 0; k < MAX; k++){
printf("%d ", number[k]);
}
printf("\n");
}
}
int main(){
int number[MAX] = {0};
int i;
srand(time(NULL)); //刷新每次产生的随机数,若无此句,每次随机数相同,亲自尝试一下便知
printf("\n选择排序:\n\n");
printf("排序前:");
for(i = 0; i < MAX; i++){
number[i] = rand() % 100; //产生0-99的随机数,这里没有采用固定的数组值进行排序,随机生成
printf("%d ", number[i]);
}
printf("\n\n");
selsort(number);
return 0;
}