三叉堆排序算法
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;
}
7万+

被折叠的 条评论
为什么被折叠?



