有点像冒泡,但这个是先找到位置然后直接交换,每次确定一个最小的元素,冒泡是一边移动一边比较,每轮确定一个最大/最小的元素。可以改进下,同时找最大和最小的
void selectSort(int a[], int len) {
for (int i = 0; i < len-1; i++) {//比较n-1次
int min = i;
for (int j = i + 1; j < len; j++) {//找最小的元素
if (a[j] < a[min])min = j;
}
if(i!=min)swap(a[min], a[i]);
}
}
void selectSort2(int a[], int len) {
//每轮比较都会找到最大和最小值,所以i++/end--
for (int i = 0, end = len - 1; i < len - 1; i++,end--) {
int min = i,max= end;
if (a[i] > a[max]) {
swap(a[max], a[i]);
max = i;
}//j从i+1开始,会跳过最大值的比较,这里单独比较一次
for (int j = i + 1; j <= end; j++) {
if (a[j] < a[min])min = j;
if (a[j] > a[max])max = j;
}
if (i != min) swap(a[min], a[i]);
if (end != max) swap(a[max], a[end]);
}
}