双调排序思想及实现(C语言)

双调排序思想及实现(C语言)

996.icu LICENSE

  • 什么是双调排序
  • 双调排序怎么实现

阅读之前注意:

本文阅读建议用时: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的幂次方个元素的序列,我们能采用双调排序吗?

如果本文对你有帮助,不如请我一罐可乐吧 🍼
在这里插入图片描述


  1. 方法基于《GPU高性能运算之CUDA》–5.1.1. ↩︎

  2. 程序改进自《GPU高性能运算之CUDA》–p191. ↩︎

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值