一、总体思路
分成两个区域:排好序区(数组前面部分,绿色部分) + 待排序区(数组后面部分,黑色部分)。
不断从后面未排序区中选最小的出来放到排序区,使得已排序区不断扩大。 --- 插入排序是遍历已排序区,选择排序是遍历未排序区。
A | B | C | D | E | F | G | H |
初始时刻:已排序区为空。
每趟:从头到尾遍历未排序区,从中选出一个最小值出来,放入已排序去区。已排序区增加一个,未排序区减少一个,未排序区起始下标加1。
二、优化
不用每次都记录未排序区最小值,只需记录其下标即可。
三、代码
// 选择排序
void SelectSort(int arrayData[], int arraySize)
{
int i, j;
for (i = 0; i < arraySize - 1; i++) {
int minIdx = i; // 已排序区待扩充的位置,也是未排序区第一个元素
for (j = i + 1; j < arraySize; j++) {
if (arrayData[j] < arrayData[minIdx]) {
minIdx = j; // 记录当前选出来的最小值的下标
}
}
if (minIdx != i) {
int tempValue = arrayData[i];
arrayData[i] = arrayData[minIdx];
arrayData[minIdx] = tempValue;
}
}
}