三叉堆排序算法(C++)

三叉堆排序算法

C++实现三叉堆排序并与传统二叉堆排序进行比较

三叉堆排序
向下调整算法

template<class ElemType>
void FilterDown_3(ElemType heapArr[], int low, int high)
{
	int f = low ,i = 3*low + 1;
	ElemType e = heapArr[low];
	while(i <= high ){
        if(i <= high - 2){
            if(heapArr[i+2]>heapArr[i+1]&&heapArr[i+2]>heapArr[i])
			   i+=2;
            else if(heapArr[i+1]>heapArr[i]&&heapArr[i+1]>heapArr[i+2])
               i+=1;
        }
        else
            if(i<high&&heapArr[i]<heapArr[i+1])
			   i+=1;
		if(e >= heapArr[i]) break;
		else {
			heapArr[f] = heapArr[i];
			f = i;
            i = 3*f+1;
		}
	}
	heapArr[f] = e;
}

排序函数

template<class ElemType>
void HeapSort_3(ElemType elem[],int n)
{
    int i;
    for(i=(n-3)/3;i>=0;--i)
        FilterDown_3(elem,i,n-1);
    for(i=n-1;i>0;--i)
    {
        Swap(elem[0],elem[i]);
        FilterDown_3(elem,0,i-1);
    }

}

二叉堆排序
向下调整算法

template <class ElemType>
void FilterDown(ElemType elem[], int low, int high)
// 操作结果:将以low为根的子树调整成为一个最大堆
{
    int f = low, i = 2 * low + 1;
    ElemType e = elem[low];
    while (i <= high) {			// f为被调整结点,i为f的最大孩子
		if (i < high && elem[i] < elem[i + 1])
			i++;				// f有右孩子,且右孩子的值更大, i指向右孩子
		if (e < elem[i])	{	// 孩子的值大于其双亲,则进行向下调整
			elem[f] = elem[i];
            f = i;
            i = 2 * f + 1;
		}
		else
            break;
	}
	elem[f] = e;
}

排序函数

template <class ElemType>
void HeapSort(ElemType elem[], int n)
// 操作结果:对数组elem进行堆排序
{
	int i;
	for (i = (n-2)/2; i >= 0; --i) // 初始建堆,将elem[0 .. n - 1]调整成最大堆
		FilterDown(elem, i, n - 1);
	for (i = n - 1; i > 0; --i)	{  // 第i趟堆排序
		Swap(elem[0], elem[i]);
			// 将堆顶元素和当前未经排序的子序列elem[0 .. i]中最后一个元素交换
		FilterDown(elem, 0, i - 1);	// 将elem[0 .. i - 1]重新调整为最大堆
	}
}

随机生成数组函数

int *generateRandomArray(int n, int rangeL, int rangeR) {
	int *arr = new int[n]; // 创建一个 n个元素的数组
	srand(time(NULL)); // 随机种子
	for (int i = 0; i < n; i++)
	    arr[i] = rand() % (rangeR - rangeL + 1) + rangeL;
	return arr;
}

主函数调用

int main()
{
	int a[18]={50,79,61,40,60,81,90,2,33,71,43,22,31,35,21,19,100,95};
	int e,n=18;
	double time_1,time_2;
	cout << "排序前:";
	Display(a, n);
	HeapSort_3(a, n);
	cout << "排序后:";
	Display(a, n);
    cout << endl << endl;

    cout << "输入排序数字的个数" << endl;
    cin >>e;
    cout << "用二叉堆排序所需的时间为" << endl;
    int *arry;
    arry=generateRandomArray(e,0,100);
    clock_t start,finish;
    start=clock();
    HeapSort(arry,e);
    finish=clock();
    time_1=(double)(finish-start);
    cout <<time_1<<"ms"<<endl;

    cout << "用三叉堆排序所需的时间为" << endl;
    arry=generateRandomArray(e,0,100);
    start=clock();
    HeapSort_3(arry,e);
    finish=clock();
    time_2=(double)(finish-start);
    cout <<time_2<<"ms"<<endl;

    double time=time_1/time_2;
    cout<<"二叉树排序时间/三叉树排序时间="<<time<<endl;

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值