一、优化思路
选择排序算法的思路是每次挑选出最小值或者最大值,而优化就是每一次循环既找到最小值,又找到最大值,这样在内层循环只需要遍历数组的一半次数即可。
二、代码
#include <iostream>
using namespace std;
//要针对两种情况:
//第一,当前最小值下标和当前最大值下标不需要移动,无需处理;
//第二,当前最小值的下标的数组存的是最大值,最大值下标(不处理)中的数组存的是最小值,只需要替换一次
void remove_abnormal_situation(int& min_subscript, int& max_subscript, int& length, int* array, int& r) {
if (min_subscript + max_subscript == length - 1 && min_subscript > max_subscript) {
swap(array[length - 1 - r], array[max_subscript]);
}
else if (min_subscript + max_subscript != length - 1) {
swap(array[length - 1 - r], array[max_subscript]);
swap(array[r], array[min_subscript]);
}
}
int* select_sort(int* array, int length) {
int min_subscript = 0, max_subscript = length - 1;
for (int r = 0; r < length / 2; ++r) {
for (int c = r; c < length - r; ++c) {
min_subscript = array[min_subscript] > array[c] ? c : min_subscript;
max_subscript = array[max_subscript] < array[c] ? c : max_subscript;
}
remove_abnormal_situation(min_subscript,max_subscript, length, array, r);
min_subscript = r + 1;
max_subscript = length - 2 - r;
}
return array;
}
int main() {
int array1[] = { 10,4,23,21,5,3434,342,66,77,23,6,7, 1,44,28 };
int length = sizeof(array1) / sizeof(int);
int* array = select_sort(array1, length);
for (int i = 0; i < length; ++i) {
cout << array[i] << endl;
}
return 0;
}
难点:在处理最大值和最小值时,可能出现两位置要互换一次,或不互换的情况,使用remove_abnormal_situation()在处理这个过程。