一、目的
1.熟悉算法设计的基本思想
2.掌握优先级队列的方法
二、内容与设计思想
- 利用堆实现优先级队列;
- 按照顺序插入1,3,5,7,9,2,4,6,8,10,11,13,15,12,14,构建优先级队列,打印出整个数组的内容;
- 按照顺序插入9,7,10,12,5,4,2,1,15,14,3,7,8,6,11,13,构建优先级队列,打印出整个数组的内容,并且体会不同输入顺序的情况之下数组内元素排序的差异;
- 随机生成1000、10000、100000、1000000个数,分别构建优先级队列,画图描述不同情况下的运行时间差异。
三、使用环境
推荐使用C/C++集成编译环境。
四、实验过程
1、写出矩阵生成器和算法的源代码;
#include<bits/stdc++.h>
using namespace std;
#define MaxData 1000001
typedef struct HeapStruct
{
int size;
int* x;
} MaxHeap;
typedef struct Heap
{
int m;
} IntHeap;
void PercDown(MaxHeap* H,int p)
{
int Parent,Child,X;
X=H->x[p];
for (Parent=p;Parent*2<=H->size;Parent=Child)
{
Child=Parent*2;
if (Child!=H->size && H->x[Child]<H->x[Child+1])
{
Child++;
}
if (X>H->x[Child])
{
break;
}
else
{
H->x[Parent]=H->x[Child];
}
}
H->x[Parent]=X;
}
void BuildHeap(MaxHeap* H)
{
int i;
for (i=H->size/2;i>0;i--)
{
PercDown(H,i);
}
}
int main()
{
MaxHeap* H=new MaxHeap;
H->x=new int[MaxData];
int size=0;
cin>>size;
H->size=size;
H->x[0]=1000001;
srand(time(0));
for (int i=1;i<=size;i++)
{
int x;
x=rand()%1000000;
H->x[i]=x;
}
clock_t startTime,endTime;
startTime = clock();
BuildHeap(H);
endTime = clock();
cout << "The run time is:" <<(double)(1000*(endTime - startTime) / CLOCKS_PER_SEC) << "ms" << endl;
return 0;
}
2、分别画出各个实验结果的折线图