面試官都在問 比較類排序系列 堆排序

2021-10-20 21:49:58 字數 1868 閱讀 1231

堆排序是利用堆進行排序的方法。假設進行公升序排序,則它的基本思想是,將待排序的序列構造成乙個大頂堆,這是乙個建堆的過程。此時,整個序列的最大值就是堆頂的根結點。將它與堆陣列的末尾元素交換,此時末尾元素就是最大值,然後將剩餘的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是...