直接选择排序
代码(瑕疵版)
比如这个数组,26 2 5 3 9 4 8 5 1 7,当begin与maxi重合时,maxi就会换到后面去
void SelectSort(int* a, int n)
{
int begin = 0, end = n - 1;
int mini = begin, maxi = begin;
while (begin < end)
{
for (int i = 0; i <= end; ++i)
{
if (a[i] < a[mini])
{
mini = i;
}
if (a[i] > a[maxi])
{
maxi = i;
}
}
Swap(&a[begin], &a[mini]);
Swap(&a[end], &a[maxi]);
++begin;
--end;
}
}
代码(优化版)
void SelectSort(int* a, int n)
{
int begin = 0, end = n - 1;
int mini = begin, maxi = begin;
while (begin < end)
{
for (int i = 0; i <= end; ++i)
{
if (a[i] < a[mini])
{
mini = i;
}
if (a[i] > a[maxi])
{
maxi = i;
}
}
Swap(&a[begin], &a[mini]);
if (begin == maxi)
{
maxi = mini;
}
Swap(&a[end], &a[maxi]);
++begin;
--end;
}
}
性能
最坏时间复杂度O(N^2) 最好时间复杂度O(N^2) 整体而言最差的排序,因为无论什么情况都是O(N^2)
|