*二路选择排序是在选择排序的基础上进行的改进,在一次循环中
同时选出最大和最小的数,分别放到序列尾和序列头,提高了排序的效率
void SelectSort(int *a, int n)
{
int begin =0, end = n - 1;
while (begin < end)
{
int mini = begin, maxi = begin;
for (int i = begin; i <= end; ++i)
{
if (a[i] < a[mini])
{
mini = i;
}
if (a[i]>a[maxi])
{
maxi = i;
}
}
Swap(&a[begin], &a[mini]);
if (maxi==begin)
{
//要注意的是:
//如果最大的位置在begin的话,由于进行了交换
//所以将mini赋值给maxi,这样才不会出错!
maxi = mini;
}
Swap(&a[end], &a[maxi]);
//最大和最小的数放置好后,
++begin;
--end;
//缩减了序列
}
}
void PrintArray(int* arr, int n)
{
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
}
void main()
{
int arr[] = { 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
int n = sizeof(arr) / sizeof(arr[0]);
SelectSort(arr, n);
PrintArray(arr, n);
}
经典排序——二路选择排序(同时选出最大和最小的数)
最新推荐文章于 2023-05-11 14:25:25 发布