一、选择排序
void SelectSort(int* array, int size)
{
//size-1:每次都会排好一个数据,所以每次都需要进行-1
for (int i = 0; i < size - 1; i++)
{
//用maxPos标记最大的数据
int maxPos = 0;
//size-i:后面数据已经排好序了,直接不用管
for (int j = 0; j < size - i; j++)
{
//找最大的数据
if (array[j] > array[maxPos])
maxPos = j;
}
//如果最大的数据就是最后一个,就没有比较进行比较
if (maxPos != size - i - 1)
Swap(&array[maxPos], &array[size - i - 1]);
}
}
二、选择排序优化
优化点:上述代码是一次找一个,这次我们同时找最大的和最小的,和对应的位置交换
void SelectSortOP(int* array, int size)
{
//定义这个就是减少范围来的,将已经排序好的直接去掉
int begin = 0;
int end = size - 1;
//标记最大或者最小的元素,以便于之后交换
int MaxPos = begin;
int MinPos = begin;
while (begin < end)
{
//index用于遍历数组
int index = begin + 1;
//标记最大最小的元素
while (index <= end)
{
if (array[MaxPos] < array[index])
MaxPos = index;
if (array[MinPos] > array[index])
MinPos = index;
++index;
}
//交换
if (MinPos != left)
Swap(&array[MinPos], &array[left]);
if (MaxPos != end)
Swap(&array[MaxPos], &array[end]);
begin++;
end--;
}
}
三、选择排序优化2
优化点:此时的代码还存在一点瑕疵,如果最小值在最后侧的话,那么交换的时候,MinPos会更新
void SelectSort_2(std::vector<int> &arr)
{
int len = arr.size();
int left = 0;
int right = len - 1;
while(left < right)
{
int min_pos = left;
int max_pos = left;
for(int i = left; i <= right; ++i){
if(arr[min_pos] > arr[i]){
min_pos = i;
}
if(arr[max_pos] < arr[i]){
max_pos = i;
}
}
if(min_pos != left)
swap(arr[min_pos], arr[left]);
if(max_pos == left){
max_pos = min_pos;
}
if(max_pos != right)
swap(arr[max_pos], arr[right]);
++left, --right;
}
}