双调排序思想及实现(C语言)
- 什么是双调排序
- 双调排序怎么实现
阅读之前注意:
本文阅读建议用时:26min
本文阅读结构如下表:
项目 | 下属项目 | 测试用例数量 |
---|---|---|
什么是双调排序 | 无 | 0 |
双调排序怎么实现 | 无 | 1 |
什么是双调排序
双调排序是基于四元素排序发展起来的一种排序方法,单纯的双调排序适用于2的幂次方个元素的序列的排序。而选择排序和冒泡排序都属于三元素排序。
四元素排序的思想是这样的,比如说有(3,2,1,4)这一个序列,我们要按照从小到大(升序)的顺序来排序。
(3,2,1,4)–>(2,3)(4,1)–>(2,1)(4,3)–>(1,2)(3,4)。
以上过程可总结为这样的规律(实现整体升序):
第一步,序列等分,第一部分升序,第二部分降序;
第二步,两个子序列对应元素比较互换;
第三步,对两个子序列均升序排序。1
经过个人的思考,我认为原理可用下图表示:
第一步的升序和降序是为了找出一个等位值,第二步把两个子序列对应位置的元素进行比较,找到这个等位值,把小于等位值的交换到第一个子序列,大于等位值的交换到第二个子序列,所以第三步中只需要分别对子序列进行排序即可实现整体的排序。
双调排序怎么实现
我们通过C程序来实现双调排序。
参考以下代码:
#include<stdio.h>
#include<stdlib.h>
#define up 1
#define down 0
int a[8] = { 1, 5, 4, 7, 8, 3, 2, 6 };
void compare(int *a,int *b,int type)
{
int tmp = 0;
if (type == up)
{
if (*a > *b)
{
tmp = *a;
*a = *b;
*b = tmp;
}
}
else if (type == down)
{
if (*a < *b)
{
tmp = *a;
*a = *b;
*b = tmp;
}
}
else
printf("err,type\n");
}
void sort(int *a,int num,int type)
{
if (num <= 1)
return;
int n = num / 2;//序列等分
sort(a, n, type);//升
sort(a + n, n, 1 - type);//降
for (int i = 0; i < n; i++)//中间过程
compare(&a[i], &a[i + n], type);
sort(a, n, type);//升
sort(a + n, n, type);//升
}
void main()
{
sort(a, 8, up);
for (int i = 0; i < 8; i++)
printf("%d ", a[i]);
system("pause");
}
代码中sort()函数中的注释:升与降对应第一步,中间过程对应第二步,升与升对应第三步。2
下一篇博客将会讨论:对于不是2的幂次方个元素的序列,我们能采用双调排序吗?
如果本文对你有帮助,不如请我一罐可乐吧 🍼