选择排序
之前的思路:
void select_sort(int* a, int n)
{
for (int i = 0; i < n-1; ++i)
{
int mini = i;
for (int j = i + 1; j < n; ++j)
{
if (a[j] < a[mini])
{
mini = j;
}
}
if (mini != i)
{
swap(a[mini], a[i]);
}
}
}
这个方法是最常见的选择排序,
核心是要明确i和j的位置,i为0,j为i+1,从i+1开始找比a[mini]小的数,找到后更新mini,
然后让a[mini]和a[i]交换
每执行一次外循环都能确定一个最小的数。
现在的思路:
void select_sort(int* a, int n)
{
int begin = 0, end = n - 1;
int mini = begin, maxi = begin;
while (begin<end) {
for (int i = begin; i <= end; ++i)
{
if (a[mini] > a[i])
{
mini = i;
}
if (a[maxi] < a[i])
{
maxi = i;
}
}
swap(a[begin], a[mini]);
if (a[begin] == a[maxi])
{
maxi = mini;
}
swap(a[end], a[maxi]);
++begin;
--end;
}
}
这个思路想比之前的那个效率明显变高了。
执行一次while循环便可以确定一个最小的数,以及一个最大的数。
但是这个方法有一个特殊情况,就是a[begin]就是最大的数,
就是maxi和begin对应的都是最大的数,当a[begin]和a[mini]发生交换后,
maxi对应的数不是最大的了,需要更新一下maxi,
及将mini赋值给maxi,
maxi=mini
最后当begin=end时这个序列便是有序了。