1.前言
根据双向冒泡排序改编,大数从左向右移动,小数从右向左移动
2.实现
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NUM 7
#define swap(a,b) {int t=a;a=b;b=t;} //宏定义交换函数
//void SelectionSort1(int* a) //选择排序1
//{
// int i, j;
// for (i = 0; i < NUM - 1; i++)
// {
// for (j = i + 1; j < NUM; j++)
// {
// if (a[i] > a[j])
// swap(a[i], a[j]);
// }
// }
//}
//void SelectionSort2(int* a) //选择排序2
//{
// int i, j;
// for (i = 0; i < NUM - 1; i++)
// {
// int temp = i;
// for (j = i + 1; j < NUM; j++)
// if (a[temp] > a[j]) //找到最小值
// temp = j; //记录
// swap(a[temp], a[i]); //交换
// }
//}
void SecSelectionSort(int* a) //双向选择排序
{
int i, j, LeftIndex = 0, RightIndex = NUM - 1;
while (LeftIndex<RightIndex)
{
for (i = LeftIndex + 1; i <= RightIndex; i++)
{
if (a[LeftIndex] > a[i])
swap(a[LeftIndex], a[i]);
}
LeftIndex++;
for (i = RightIndex - 1; i >= LeftIndex; i--)
{
if (a[i] > a[RightIndex])
swap(a[i], a[RightIndex]);
}
RightIndex--;
}
}
int main()
{
srand((unsigned int)time(NULL)); //设置随机种子 (time()的返回类型为size_t)
int a[NUM];
int i;
for (i = 0; i < NUM; i++)
a[i] = rand() % 100;
for (i = 0; i < NUM; i++)
printf("排序前: %d ", a[i]);
//SelectionSort1(a); //选择排序1
//SelectionSort2(a); //选择排序2
SecSelectionSort(a); //双向选择排序
printf("\n");
for (i = 0; i < NUM; i++)
printf("排序后: %d ", a[i]);
return 0;
}
3.总结
效率提升有限
4.更新日志
2022.2.27 整理上传(C)
欢迎交流、讨论、补充、指正~