“选择排序法” 基本原理
将要排序的对象中每次选择一个值,按照非递减(从小到大)(或非递增(从大到小))顺序进行排列,每经过一次排序,要排序对象便会分为一个待排序部分和已排序部分。之后,进行相同的过程,直至顺序排列完成。
如下所示:
排序前: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;}//借助宏定义实现元素交换,可以修改为函数
#include<iostream>
using namespace std;
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]);
}
cout<<"第 "<<i+1<<" 次排序:";
for(k = 0; k < MAX; k++){
cout<<number[k]<<' ';
}
cout<<endl;
}
}
int main(){
int number[MAX] = {0};
int i;
srand(time(NULL)); //刷新每次产生的随机数,若无此句,每次随机数相同,亲自尝试一下便知
cout<<"\n选择排序:\n\n";
cout<<"排序前:";
for(i = 0; i < MAX; i++){
number[i] = rand() % 100; //产生0-99的随机数,这里没有采用固定的数组值进行排序,随机生成
cout<<number[i]<<' ';
}
cout<<endl<<endl;
selsort(number);
return 0;
}