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