基本思路
每次选出剩余序列中最小/最大的数、与剩余序列的第一个交换位置。
示例:
// 升序,左起
/*初始值*/ 10, 7, 1, 8, 5, 12, 6, 3, 9
/*第1趟*/ 1, 7, 10, 8, 5, 12, 6, 3, 9
/*第2趟*/ 1, 3, 10, 8, 5, 12, 6, 7, 9
/*第3趟*/ 1, 3, 5, 8, 10, 12, 6, 7, 9
/*第4趟*/ 1, 3, 5, 6, 10, 12, 8, 7, 9
/*第5趟*/ 1, 3, 5, 6, 7, 12, 8, 10, 9
/*第6趟*/ 1, 3, 5, 6, 7, 8, 12, 10, 9
/*第7趟*/ 1, 3, 5, 6, 7, 8, 9, 10, 12
/*第8趟*/ 1, 3, 5, 6, 7, 8, 9, 10, 12
/*第9趟*/ 1, 3, 5, 6, 7, 8, 9, 10, 12
代码
void printList(int *l, int n) {
for (int i = 0; i < n; i++) {
printf("%d ", l[i]);
}
printf("\n");
}
int main() {
int list[50] = { 10, 7, 1 , 8, 5, 12, 6, 3, 9};
printList(list, 9);
// 简单选择排序,每次选取最小的放最前面
for (int i = 0; i < 9; i++ ) {
int minIndex = i;
for (int j = i+1; j < 9; j++){
if ( list[j] < list[minIndex]){
// 替换最小值的 index
minIndex = j;
}
}
int k = list[i];
list[i] = list[minIndex];
list[minIndex] = k;
printList(list, 9);
}
system("pause");
return 0;
}
进阶 – 二元选择排序
简单选择排序每次循环只选出了一个数, 二元选择排序则同时选出最大最小的元素。
这样外循环只需要 n/2 次就能得到结果。
示例:
// 升序,二选选择排序
/*初始值*/ 10, 7, 1, 8, 5, 12, 6, 3, 9
/*第1趟*/ 1, 7, 10, 8, 5, 9, 6, 3, 12
/*第2趟*/ 1, 3, 7, 8, 5, 9, 6, 10, 12
/*第3趟*/ 1, 3, 5, 8, 7, 6, 9, 10, 12
/*第4趟*/ 1, 3, 5, 6, 7, 8, 9, 10, 12
代码
int main() {
int list[50] = { 10, 7, 1 , 8, 5, 12, 6, 3, 9};
printList(list, 9);
// 二元选择排序,每次选取最小的放最前面,选最大的放后面
for (int i = 0; i < 9 / 2; i++) {
int minIndex = i;
int maxIndex = i;
for (int j = i+1; j < 9 - i; j++){
if ( list[j] < list[minIndex] ){
minIndex = j; // 找出最小
} else if ( list[j] > list[maxIndex] ){
maxIndex = j; // 找出最大
}
}
if ( i != minIndex ){
int k = list[i];
list[i] = list[minIndex];
list[minIndex] = k;
}
// 要特别留意 maxIndex == i 的时候,i 可能会被换掉
if ( maxIndex == i ){
maxIndex = minIndex;
}
int m = list[9 - i - 1];
list[9 - i - 1] = list[maxIndex];
list[maxIndex] = m;
printList(list, 9);
}
system("pause");
return 0;
}
以上
原文链接 http://blog.youkuaiyun.com/u011546766/article/details/74024935