-
維護堆時,不會初始化標誌,並且無法檢測到它是否進入 while 迴圈。
只需在 while 之前為標誌分配乙個非 0 值,以確保它進入迴圈。
另外,我不明白為什麼你用乙個非常小的堆來反序排列陣列,然後反序輸出,這純粹是多餘的。 只需使用非常大的一堆。
-
*heapsort*/
#include
#include
#include
int a[1000];
int n;
void heap(int d ,int m) 維護堆。
int min,flag=1,temp;
while(flag)
flag=0;
min=a[d];
if(d*2<=m&&a[d*2]=1;i--)heap(i,n);初始堆從下到上按順序構建。
int main()
int i,temp;
printf("please enter the number(<999) of the number is to be sorted.");
scanf("%d",&n);
printf("please enter each number.");
for(i=1;i<=n;i++)scanf("%d",&a[i]);
long tim=gettickcount();
buildheap();
for(i=n;i>=2;i--)
temp=a[1];
a[1]=a[i];
a[i]=temp;
heap(1,i-1);
for(i=n;i>=1;i--)printf("%d",a[i]);
printf("it takes %ld (ms).",gettickcount()-tim);
system("pause");
-
使用左右樹的大小對堆進行排序是正確的。 這沒有錯。
-
我將發布我自己的模板,我的堆排序。
#include
#include
void heapadjust(int array, int a, int nlength)
void heapsort(int array, int nlength)
int main()
-
堆排序 1,堆定義。
堆是具有以下特徵的 n 個關鍵字的序列:
ki<=k2i
和 ki<=k2i+1 (1<=i<=n 2) (1)。
或者 ki>=k2i
和 ki>=k2i+1 (1<=i<=n 2) (2)。
ki>=k2i
滿足式(1)的稱為極簡堆,或非常小的堆,或小堆,滿足式(2)的稱為最大化堆,或非常大的堆。 在本節中,我們將使用乙個小型化堆作為示例。
堆與完整二叉樹的關係:堆是n個元素(關鍵字)的序列,滿足完整二叉樹順序儲存中節點之間的關係(父項與子項序列號的關係)。
17、28、51、33、62、96、87、51為小頂樁。
96、51、87、33、28、62、51、17是大頂樁。
二進位堆 2,堆排序的基本問題。
由於頂部元素(關鍵字)是最小的元素,因此它是排序序列中最小的元素,輸出後,其他元素被調整成乙個堆,新的頂部元素是排序序列的第二個元素。 這樣,就可以使用堆將無序序列轉換為有序序列。 因此,堆排序的基本問題是:
1)如何打樁。
2)如何調整樁。
3.如何調整樁。
將最後乙個元素與堆的頂部元素交換(相當於輸出堆的頂部元素)後,從堆頂部到倒數第二個元素的所有元素都符合堆的定義。 下面是一種過濾方法,用於將所有元素(包括堆的頂部元素)放入堆中。 一大堆根。
void sift(rectype r,int i,int m)
for‖heapsort
6、堆排序演算法分析。
時間複雜度為 o(nlogn),交換只需要乙個記錄大小的輔助儲存空間。
-
就給大家乙個堆疊的**吧!
小根樹 * 包括
using namespace std;
int a[10000];
int n;
void check(int i)}}
void bheap()
int main()
system("pause");
return 0;}
-
最小堆中的刪除數。
void minheapdeletenumber(int a, int n)
此函式的問題在於,您應該首先將已刪除的元素與最後乙個元素交換,進行比較,然後決定是向上還是向下調整。
-
你顯然錯了 堆排序首先必須有多個資料,陣列中應該有一組資料 int a 20,然後給陣列賦值,堆排序不是自己寫的......
-
minheapaddnumber();
minheapsorttodescendarray();
兩個函式傳遞的引數與表單引數不匹配。
-
堆排序相當於排序二叉樹,只不過根節點的優先順序大於任何子節點的優先順序,這樣每次都可以刪除根節點,然後可以調整整個堆。
program heap;
var a:array[1..10000] of integer;
n,i:integer;
procedure down(i:integer);
var x,j:integer;
beginx:=a[i];
j:=i*2;
while j<=n do
beginif a[j]>a[j+1] then j:=j+1;
if a[j]begin
a[i]:=a[j];
i:=j;j:=i*2;
end else break;
end;a[i]:=x;
end;procedure delete(i);
beginn:=n-1;
if (n=0)or(i=n+1) then exitelse
begina[i]:=a[n+1];
down(i);
end;end;
beginreadln(n);
for i:=1 to n do read(a[i]);
for i:=n div 2 downto 1 do down(i);
for i:=1 to n do
beginwrite(a[1]);
delete(1);
end;end.
-
你可以想象,這個資料被用來形成乙個二叉樹,其中每個節點的左邊子節點都比他小,子節點比他大,這樣就建立了乙個排序樹。 最後,在遍歷一側的中間順序中,讀取乙個點以列印該點的資料。
PS:樓上的那個師傅是誰? 程式似乎是對的?!
-
for (int i = heap[0] /2; i > 0; i++)
heapmaxheapify(heap, i);
這個迴圈是乙個無限迴圈。
首先,看看牛奶的來源。
地球上南北緯40-50°之間的溫帶草原溫度適宜,氣候宜人,雨量充沛,土壤肥沃,有100多種優質天然牧場,再加上對環境無汙染,這些要素共同決定了牧場和奶牛羊的生產環境,也成為鮮奶品質(蛋白質含量, 乳脂含量、乳幹物質或總乳固體含量、潔淨度等指標),因此該區域被稱為“**奶源帶”。 >>>More