堆排序中的陷阱

2021-09-16 11:53:53 字數 1489 閱讀 6517

採用堆排序,將陣列按照公升序排列並輸出。

如:

a[i] = a[i]^a[j];

a[j] = a[j]^a[i];

a[i] = a[i]^a[j];

但該方法的正確性取決於乙個關鍵條件:

i !=j;
如果二者相等,則該處的值肯定為0.了解了這些,就可以看下面的排序了。

//初始化大頂堆,並進行交換與堆調整。adjustheap的調整範圍變為[param2,param3)

public static void heapsort(int a)

for(int i= a.length-1; i>=0; i--)

} // 調整細節,父親與子節點的比較直到葉子

private static void adjustheap(int a, int parent, int end)

if(tmp< a[child]) else

} a[parent]= tmp;

} private static void swap(int a, int i, int j)

此處,若對陣列最小值不為0的陣列進行排序,如int arr = ;排序後輸出的結果會是

[0, -1, 0, 3, 3, 3, 4, 4, 4, 4]

很奇怪對不對,加入我們將該結果與正確結果比較,

錯誤結果:[0, -1, 0, 3, 3, 3, 4, 4, 4, 4]

正確結果:[-2, -1, 0, 3, 3, 3, 4, 4, 4, 4]

會發現僅僅是最小值出了差錯,變為了0,其餘結果是正確的。這時可能會想到是異或交換出錯的原因。再去看下包含用了異或交換方法的**

發現交換的順序分別為0-len-1;0-len-2;.....最後一次是0與0交換的!這一部分沒有必要,也導致了錯誤的結果

將結束條件改為i>0即可

//初始化大頂堆,並進行交換與堆調整。adjustheap的調整範圍變為[param2,param3)

public static void heapsort(int a)

for(int i= a.length-1; i>0; i--)

} // 調整細節,父親與子節點的比較直到葉子

private static void adjustheap(int a, int parent, int end)

if(tmp< a[child]) else

} a[parent]= tmp;

} private static void swap(int a, int i, int j)

這樣就可以安全使用異或交換啦~還減少了乙個調整堆的步驟

堆排序 堆排序優化 索引堆排序

堆排序 堆排序優化 索引堆排序 注 堆排序 索引堆排序 都是不穩定的排序。注 索引最大堆排序有誤!有沒有大神可以指點一二?1 堆 所有元素 都從索引0開始 父親結點索引 i 左孩子結點索引 2i 1 右孩子結點索引 2i 2 左後乙個非葉子結點索引 n 1 2 用於構建堆,從最後乙個非葉子結點索引開...

堆排序 堆排序優化 索引堆排序

堆排序 堆排序優化 索引堆排序 注 堆排序 索引堆排序 都是不穩定的排序。注 索引最大堆排序有誤!有沒有大神可以指點一二?1 堆 所有元素 都從索引0開始 父親結點索引 i 左孩子結點索引 2i 1 右孩子結點索引 2i 2 左後乙個非葉子結點索引 n 1 2 用於構建堆,從最後乙個非葉子結點索引開...

java中的排序演算法 堆排序

利用堆這種資料結構設計的一種排序演算法。堆是乙個近似完全二叉 樹的結構,並同時滿足堆的性質 子節點的鍵值或索引總是小於 或大於 它的父節點。對於大 小 頂堆而言,堆頂元素的權值 大 小 堆排序是乙個非常穩定的演算法,對於堆排序而言,數 據的初始順序對它的複雜度並沒有影響。原理 將待排序的數組建堆,然...