排序算法(3)选择排序
原理:思想:两个变种(1)单侧选择:在一个无序数组中选择出每一轮中最大值(或最小值)元素,放到最前面或最后面(升序)(2)双向选择:在一个无序数组中选择出每一轮中最值元素,然后把这一轮中最前面的元素和min交换,最后面的元素和max交换;然后缩小范围(开始位置(begin++)++,最后位置(end–)--),重复上面步骤,最终得到有序序列(升序)。
代码实现:
单侧选择版:
void SelectSort1(int a[], int n)
{
for (int i = 0; i < n; i++)
{
int temp = i;
for (int j = i+1; j < n; j++)
{
if (a[temp] < a[j]) temp = j;//升序,改成 > 是降序
}
swap(a[i],a[temp]);
}
}
双向选择版:
void SelectSort(int a[], int n)
{
int begin = 0;
int end = n - 1;
while (begin < end)
{
int min = begin, max = begin;
for (int i = begin; i <= end; i++)//得出这一段里的最大值和最小值
{
if (a[min] > a[i])
min = i;
if (a[max] < a[i])
max = i;
}
//最小值与begin交换,最大值与end交换,升序。反之,是降序
swap(a[min], a[begin]);
if (max == begin)//如果首元素恰好是最大的,则需要先把min 和 max的位置交换,再交换,否则经过两次交换,又回到原来的位置
max = min;
swap(a[max], a[end]);
begin++;
end--;
}
}