堆排序是利用堆進行排序的方法。假設進行公升序排序,則它的基本思想是,將待排序的序列構造成乙個大頂堆,這是乙個建堆的過程。此時,整個序列的最大值就是堆頂的根結點。將它與堆陣列的末尾元素交換,此時末尾元素就是最大值,然後將剩餘的n-1個序列,從根開始進行向下調整,重新構造成乙個堆,這樣就會得到n個元素中的次小值。如此反覆執行交換,向下調整,便能得到乙個有序序列了。如果是降序排序,則是用小頂堆,後面的過程類似。
如下圖所示
1.1向下調整
堆的向下調整主要是為了讓堆中的每乙個資料都滿足堆的性質。如果某個資料所在的位置不滿足堆的性質,則需要對其進行向下調整,給資料找到乙個合適的位置。向下調整的前提條件是,當前被調整資料的子結構必須已經是乙個堆。向下調整的過程如下:
從左右孩子中選擇乙個最大的
如果當前被調整的資料小於第一步選出的孩子,則進行交換,更新需要調整的資料位置以及孩子的位置,繼續執行第一步。否則結束調整。
當更新的位置超出序列的範圍則結束調整。
向下調整的過程如下所示:
向下調整的**如下:
void shiftdown(int* arr, int size, int parent)
else
}}
public
static
void
shiftdown
(int
arr,
int sz,
int parent)
if(arr[child]
> arr[parent]
)else
}}
1.2建堆
要對乙個序列進行排序,首先應該用序列見乙個堆。此時可以從最後乙個非葉子節點開始,不斷的執行向下調整演算法,直到堆頂位置,如此,就可以建乙個堆。
過程如下圖所示:
//交換 《---》向下調整
// 未排序的元素個數
int end = n - 1;
while (end > 0)
}
public
static
void
swap
(int
arr,
int i,
int j)
public
static
void
heapsort
(int
arr)
//交換 《---》向下調整
// 未排序的元素個數
int end = len -1;
while
(end >0)
}
3.1 時間複雜度堆排序中過程中需要不斷的進行向下調整的操作,向下調整的操作時間複雜度為o(logn), 對於每乙個資料,都需要進行一次向下調整,故時間複雜度為o(nlogn)。
3.2 空間複雜度
堆排序過程中只需要建立常數個區域性變數,故空間複雜度為o(1)。
面試官都在問 選擇排序
選擇排序的思想不難理解。選擇排序把資料分成兩組來看待,一組已經有序的資料和一組無序的資料,排序開始之前,有序資料的個數為0。每次從未排序的資料中選取最小值,並與未排序的最左資料進行交換,直到未排序的資料為0,則結束排序。演算法過程如下圖所示 3.1 時間複雜度選擇排序每次需要遍歷未排序的資料,尋找最...
面試官都在問 快速排序C 實現
快排是c.a.r.hoare在1960提出的一種排序演算法,這是一種採用分治思想的排序演算法,大致分為三個步驟。定基準 首先選擇乙個元素作為基準值 劃分區 所有比基準小的元素置於基準左側,比基準大的元素置於右側,構成左右兩個子串行 遞迴呼叫 遞迴地呼叫此切分過程,切分其子序列,直到子串行只含有乙個值...
面試官都在問 Linux命令 grep
grep是乙個文字過濾器,作用是在檔案中查詢符合我們要求的內容。第一種形式,從指定的檔案中找出匹配pattern的行 grep option pattern file1,file2,第二種形式,從管道中找出匹配pattern的行 cmd grep option pattern 說明 pattern是...