选择排序是排序算法的一种,这里以从小到大排序为例停止解说。
根本思惟及举例阐明
选择排序(从小到大)的根本思惟是,起首,选出最小的数,放在第一个地位;然后,选出第二小的数,放在第二个地位;以此类推,直到一切的数从小到大排序。
在完成上,我们平日是先肯定第i小的数地点的地位,然后,将其与第i个数停止交流。
下面,以对 3 2 4 1 停止选择排序阐明排序进程,运用min_index 记载以后最小的数地点的地位。
第1轮 排序进程 (寻觅第1小的数地点的地位)
3 2 4 1(最后, min_index=1)
3 2 4 1(3 > 2, 所以min_index=2)
3 2 4 1(2 < 4, 所以 min_index=2)
3 2 4 1(2 > 1, 所以 min_index=4, 这时分肯定了第1小的数在地位4)
1 2 4 3 (第1轮后果,将3和1交流,也就是地位1和地位4交流)
第2轮 排序进程 (寻觅第2小的数地点的地位)
1 2 4 3(第1轮后果, min_index=2,只需求从地位2开端寻觅)
1 2 4 3(4 > 2, 所以min_index=2)
1 2 4 3(3 > 2, 所以 min_index=2)
1 2 4 3(第2轮后果,由于min_index地位刚好在第2个地位,无需交流)
第3轮 排序进程 (寻觅第3小的数地点的地位)
1 2 4 3(第2轮后果, min_index=3,只需求从地位2开端寻觅)
1 2 4 3(4 > 3, 所以min_index=4)
1 2 3 4(第3轮后果,将3和4交流,也就是地位4和地位3交流)
至此,排序终了。
总结及完成
选择排序对巨细为N的无序数组R[N]停止排序,停止N-1轮选择进程。第i轮拔取第i小的数,并将其放在第i个地位上。当第N-1次完成时,第N小(也就是最大)的数天然在最初的地位上。
下面给出选择排序的C言语完成。
#include<stdio.h> #include<stdlib.h> #define N 8 void select_sort(int a[],int n); //选择排序完成 void select_sort(int a[],int n)//n为数组a的元素个数 { //停止N-1轮选择 for(int i=0; i<n-1; i++) { int min_index = i; //找出第i小的数地点的地位 for(int j=i+1; j<n; j++) { if(a[j] < a[min_index]) { min_index = j; } } //将第i小的数,放在第i个地位;假如刚好,就不必交流 if( i != min_index) { int temp = a[i]; a[i] = a[min_index]; a[min_index] = temp; } } } int main() { int num[N] = {89, 38, 11, 78, 96, 44, 19, 25}; select_sort(num, N); for(int i=0; i<N; i++) printf("%d ", num[i]); printf("\n"); system("pause"); return 0; }
留意:选择排序是一种不波动的排序算法,能够会打乱两个相反数字的原有次序。
例如,序列 5 8 5 2 9, 依照从小到大排序,第一轮会将第1个数字5会和2交流,那么原序列中2个5的绝对前后次序就被毁坏了,所以选择排序是一种不波动的排序算法。