选择排序算法的思想为:从数列中选择最小值放到第一个位置,然后在剩余的数列中再选择最小值放到第二个位置,一次类推。
另一种改进为同时选择数列中的最大值和最小值,并同步更新,但是这个时候有个问题需要注意:查找到最大值和最小值,并进行更新时,如果先更新最小值到数列最前面,同时最大值正好在数列最前面,就导致数据交换错误,对此情况需要检测。
C++实现:
#include <iostream>
#include <vector>
using namespace std;
template<typename T>
void ChoisenSort(vector<T> &vec);
int main()
{
int arr[] = { 8, 3, 10, 49, 2, 6, 13, 5, 14, 7, 51, 53, 55 };
vector<int> vec(&arr[0], &arr[13]);
ChoisenSort(vec);
return 0;
}
template<typename T>
void ChoisenSort(vector<T> &vec)
{
int VSize = vec.size();
if (VSize < 1)
return;
if (1 == VSize)
{
cout << "Only one element in array: " << vec[0] << endl;
return;
}
int top = VSize;
for (int vIdx = 0; vIdx < top; vIdx++)
{
int maxIdx = vIdx;
int minIdx = vIdx;
for (int uIdx = vIdx + 1; uIdx < top; uIdx++)
{
if (vec[uIdx] > vec[maxIdx])
maxIdx = uIdx;
if (vec[uIdx] < vec[minIdx])
minIdx = uIdx;
}
if (vIdx != minIdx)
{
vec[minIdx] ^= vec[vIdx];
vec[vIdx] ^= vec[minIdx];
vec[minIdx] ^= vec[vIdx];
}
if (maxIdx == vIdx)
maxIdx = minIdx; // prevent max value locating in vIdx, if so, max value will be exchanged to minIdx, and
// next exchange will find error max value.
if (maxIdx != (top - 1))
{
vec[maxIdx] ^= vec[top - 1];
vec[top - 1] ^= vec[maxIdx];
vec[maxIdx] ^= vec[top - 1];
}
top--;
}
for (int vIdx = 0; vIdx < VSize; vIdx++)
{
cout << "value in " << vIdx << " is " << vec[vIdx] << endl;
}
return;
}