堆排序
堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o(nlogn),它也是不穩定排序。首先簡單了解下堆結構。
堆
堆是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆。
同時,我們對堆中的結點按層進行編號,將這種邏輯結構對映到陣列中就是下面這個樣子
該陣列從邏輯上講就是乙個堆結構,我們用簡單的公式來描述一下堆的定義就是:
大頂堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]
小頂堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]
堆排序基本思想及步驟
堆排序的基本思想是:將待排序序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n-1個元素重新構造成乙個堆,這樣會得到n個元素的次小值。如此反覆執行,便能得到乙個有序序列了
步驟一 構造初始堆。將給定無序序列構造成乙個大頂堆(一般公升序採用大頂堆,降序採用小頂堆)。
a.假設給定無序序列結構如下
此時,我們就將乙個無需序列構造成了乙個大頂堆。
步驟二 將堆頂元素與末尾元素進行交換,使末尾元素最大。然後繼續調整堆,再將堆頂元素與末尾元素交換,得到第二大元素。如此反覆進行交換、重建、交換。
a.將堆頂元素9和末尾元素4進行交換
a.將無需序列構建成乙個堆,根據公升序降序需求選擇大頂堆或小頂堆;
b.將堆頂元素與末尾元素交換,將最大元素」沉」到陣列末端;
c.重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換步驟,直到整個序列有序。
**實現:
package cn.datastructures.sort;
/** * 堆排:
* 最大堆需要滿足兩個條件:
* 1、堆的樹結構是完全二叉樹
* 2、堆中的每個節點的元素值不小於該節點的孩子節點的值
* 思想:分為2大步:
* 1.對給出的陣列構建最大堆
* 1)先比較父親節點的左孩子與右孩子節點的大小,在比較左孩子與右孩子最大的值與父親節點比較,
* 將如果大於父親節點則與父親節點互換,然後再進行最大堆的調整
* 2.對構建的最大堆的第乙個元素和最後乙個元素進行排序,再對亂的堆進行調整成為最大堆
* *@author administrator
* */
public
class
heapsort11 ;
system.out.println("排序前:");
printsort(arr);
system.out.println("排序後:");
heapsort(arr);
printsort(arr);
}public
static
void
heapsort(int arr)
//將最大堆的第乙個元素與最後乙個元素互換並且重新調整成為最大堆
for(int j=arr.length-1;j>0;j--)
}//構建最大堆(每個父親節點的值要大於其孩子節點)
public
static
void
buildheap(int arr,int parent,int length)
//arr[child]<=temp的情況下,滿足最大堆的條件,跳出迴圈
else
break;
}arr[parent]=temp;//把臨時變數賦值給此時孩子的節點(此時孩子節點的索引變為parent)
}//交換元素
public
static
void
swap(int arr ,int a,int b)
//列印陣列
public
static
void
printsort(int arr)
system.out.println(res.tostring());}}
結果顯示:
最大堆 排序
解除安裝最前面,下面的所有討論都是基於二叉堆 一 什麼是堆 堆是乙個陣列結構,可以看著為一顆完全二叉樹,把這顆完全二叉樹按層從上到下,每層從左至右編序號,每個序號所對應的元素即為陣列中該序號的元素 該樹出最後一層以外每一層都排滿,最後一層從左至右,先左孩子再右孩子排列,如果有父節點沒有排滿孩子 無孩...
最大堆排序
其實堆排序就是對二叉樹的一種操作,使得二叉樹的左右孩子 節點都小於父節點。我使用的是陣列的實現方式,parent i return i 2 i的父節點下標,left i return 2 i i的左子節點 right i return 2 i 1 i的右子節點.以上均為陣列元素的標號位置,在訪問元素...
堆排序(最大堆高階) 演算法導論
上篇 堆排序 最大堆 說過,是按照書中的偽碼寫出,書中的根結點是1,但一般我們陣列的下標由0開始,故而現在改為由0開始 上篇已說過實現的過程,故而不再贅述,細節可見 上篇 將其中的一些條件改變即可 首先是建堆的值,由0開始的根結點,對於a n 它的父節點是 n 1 2,並且到0為止,都是父節點 故而...