双调排序的简单实现

      先在这里记录一下代码!原理将来再补吧!

    这个算法算是有一个致命的弱点吧!那就是如果元素的个数达不到2^n个的话,要填充!

#include <iostream>
using namespace std;
void SortDown(int , int);
void MergeUp(int, int);
void MergeDown(int, int);
void Exchange(int , int);
void SortUp(int, int);
const int MAXNUM = 99999999; //如果个数不为2的次幂个,要填充的数字
int arr[1024] = {
	3, 1, 5, 9,
	7, 6, 4, 2,
	10, 25, 13, 16,
	8, 11, 14, 15,
	22
};
int main()
{
	int n = 17; //要排序的元素的个数
	int flag = 0;
	int len = 1;
	while (len < n)//循环退出的条件 len >= n
	 len = len << 1;//左移一位相当于乘以2

	if (len > n)//如果len > n,就说明数组的个数不够,要将个数填充到len个
	{
		flag = 0;
		for (int i = n; i < len; i++)
		  arr[i] = MAXNUM;
	}
	//len = n的话,说明元素的个数恰好是2的次幂个
	SortUp(0, len);
	cout<<"The Sorted Result is:"<<endl;
	for (int i = 0; i < n; i++)
		cout << arr[i] << " ";
	
	cout << endl;
	system("pause");
}

void SortUp(int beg,int n)
{
	if(n == 1)
	return;

	SortUp(beg,n / 2);//把前面的n/2个元素按递增排序
	SortDown(beg + n / 2, n / 2);//把后面n/2个元素按递减排序
	MergeUp(beg, n);//合并前面n/2个和后面n/2个数组。
	return;
}

void SortDown(int beg,int n)//类似SortUp,只是按照递减排序数组从beg开始的n个元素
{
	if(n == 1)
		return;
	SortUp(beg, n / 2); //把前面的n/2个元素按递增排序
	SortDown(beg + n / 2, n / 2); //把后面n/2个元素按递减排序
	MergeDown(beg, n); //合并前面n/2个和后面n/2个数组。
}


void MergeUp(int beg,int n)//按照从小到大的顺序合并
{
	if(n == 1) return;
	int halfN = n >> 1; //向右移一位等同于除以2

	for(int i = beg; i < beg + halfN; i++)
	{
		if(arr[i] > arr[i + halfN])
		Exchange(i, i + halfN);
	}
	MergeUp(beg, halfN);
	MergeUp(beg + halfN, halfN);
}

void MergeDown(int beg,int n) //按照从大到小的顺序合并
{
	if(n == 1) return;
	int halfN = n >> 1;
	for(int i = beg; i < beg + halfN; i++) //这一步做的是使前后两排相对应位置上的数按照从大到小排列
	{
		if(arr[i] < arr[i + halfN])
		Exchange(i, i + halfN);
	}
	MergeDown(beg, halfN); //前半部分也要按照从大到小的顺序排列
	MergeDown(beg + halfN, halfN); //后半部分也要按照从大到小排列
}

void Exchange(int i, int j)
{
	int temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值