佇列中的資料設為10個,這十個數用 srand(time(0));data=rand()%101;的方法取100以內的隨機數。
隨後進行堆排序。輸出堆排序過程中每個調整堆。
程式**如下(有點冗長,但是執行無誤):
#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#include"time.h"
//一定不要忘了用下角標啊aaaaaaa
int n=11;
typedef struct qnodeqnode,*qptr;
typedef structlinkqueue;
void initqueue(linkqueue &q) //建立乙個佇列 }
void adjust(linkqueue &q,int n) //堆調整
a=qp->data;
j=0;
qp=q.front;
while(j
b=qp->data;
j=0;
qp=q.front;
while(j<2*i)
c=qp->data;
if(a>max) max=a;
if(b>max) max=b;
if(c>max) max=c;
if(max==b)
qp->data=a;
j=0;
qp=q.front;
while(jnext;
j++;
} qp->data=b;
} if(max==c&&b!=max)
qp->data=a;
j=0;
qp=q.front;
while(jnext;
j++;
} qp->data=c;
} i--; }
} if(n%2==0) //如果n為偶數
a=qp->data;
j=0; qp=q.front; //找到k(2i+1) 的值
while(j
b=qp->data;
j=0; qp=q.front; //找到k(2i)的值
while(j<2*i)
c=qp->data;
if(a>max) max=a; //求出三者中最大值
if(b>max) max=b;
if(c>max) max=c;
if(max==b) //如果最大值為k(2i+1) 與ki交換值
qp->data=a;
j=0; qp=q.front;
while(jnext; j++;}
qp->data=b;
} if(b!=max&&max==c) //同上一步
qp->data=a;
j=0; qp=q.front;
while(jnext; j++;}
qp->data=c;
} i--;
}j=0; //最後將kn和k1進行比較
qp=q.front;
while(jnext;
j++;
} if(qp->data > q.front->next->data)}}
void sort(linkqueue &q,int n) //堆調整後的排序
printf("\n");
a=q.front->next->data; //將堆調整後的無序組的第乙個元素放入後面的有序組
qp=q.front;
while(inext;
i++;
} b=qp->data;
qp->data=a;
q.front->next->data=b;
if(n-1>1) //遞迴
sort(q,n-1);
}int main()
printf("\n");
sort(q,n);
qp=q.front;
printf("\n排序後的隊列為:\n");
while(qp!=q.rear)
return 0;
}
執行結果如下:
js資料結構 優先佇列 堆排序
優先佇列 優先佇列api class maxpq max 返回最大元素 delmax 刪除並返回最大元素 isempty 佇列是否為空 size 返回元素個數 堆 定義 在二叉堆中,每個元素都要保證大於等於另兩個特定位置的元素。當一棵二叉樹的每個節點都大於等於它的兩個子節點時,它被稱為堆有序。cla...
資料結構 堆排序 堆排序 Heap Sort
堆排序是一種選擇排序,其時間複雜度為o nlogn 堆的定義 n個元素的序列當且僅當滿足下列關係之一時,稱之為堆。情形1 ki k2i 且ki k2i 1 最小化堆或小頂堆 情形2 ki k2i 且ki k2i 1 最大化堆或大頂堆 其中i 1,2,n 2向下取整 若將和此序列對應的一維陣列 即以一...
資料結構 堆排序
include include void maxheapify int a,int length,int i void buildmaxheapify int a,int length void heapsort int a,int length void main void printf heap...