面試官都在問 快速排序C 實現

2022-09-06 07:15:10 字數 1763 閱讀 8011

快排是c. a. r. hoare在1960提出的一種排序演算法,這是一種採用分治思想的排序演算法,大致分為三個步驟。

定基準——首先選擇乙個元素作為基準值

劃分區——所有比基準小的元素置於基準左側,比基準大的元素置於右側,構成左右兩個子串行

遞迴呼叫——遞迴地呼叫此切分過程,切分其子序列,直到子串行只含有乙個值時停止遞迴

如下圖所示

上圖只完整的演示了三次劃分的過程,第一次選取3為基準值,進行一次劃分,得到了第二行的序列,此時得到兩個子串行,如第三行和第五行所示。對第三行的子串行繼續進行劃分,得到第四行的劃分結果。對第五行的子串行繼續進行劃分,得到第六行的劃分結果。後面會繼續對第四行和第六行劃分出的新的子串行繼續相同的過程,最後會得到乙個完整的有序序列。

1.1基準值

基準值的選取有多種方法。但是不同的選取方法對排序的效能會有比較大的影響。

1.2劃分

劃分是把資料分成兩部分,一部分小於基準值,一部分大於基準值,劃分過程大致如下:

從當前序列從後往前找到第乙個小於基準的數。

從當前序列從前往後找到第乙個大於基準的數。

交換找到的這兩個數。繼續執行1,2步,直到1,2步遍歷的位置相遇則結束。

基準值與相遇位置的資料進行交換,完成當前序列的劃分,此時所有小於基準的資料在左,大於等於基準的資料在右。

void swap(int* array, int i, int j)

int partion(int* array, int begin, int end)

//交換基準值和相遇位置的值

swap(array, start, begin);

//返回基準值位置

return begin;

}void quicksort(int* array, int begin, int end)

public

static

void

swap

(int

arr,

int i,

int j)

public

static

intpartion

(int

arr,

int left,

int right)

//交換基準值和相遇位置的值

swap

(arr, left, start)

;return left;

}public

static

void

quicksort

(int

arr,

int left,

int right)

}

3.1 時間複雜度快速排序的過程就是不斷的進行子串行的劃分,直到子串行中只包含乙個值,此時排序也就結束了。

3.2 空間複雜度

快速排序過程中,需要進行遞迴呼叫,所以需要進行函式壓棧操作,每乙個函式棧中占用常數空間,最好情況下,最大的遞迴呼叫深度為logn, 最壞情況下,最大遞迴呼叫深度為n, 故最好情況下為o(logn), 最壞為o(n)。

實際中,普通的排序場景,都是採用快速排序,因為其實現容易,且時間和空間的消耗都比較小,排序比較快。

面試官都在問 選擇排序

選擇排序的思想不難理解。選擇排序把資料分成兩組來看待,一組已經有序的資料和一組無序的資料,排序開始之前,有序資料的個數為0。每次從未排序的資料中選取最小值,並與未排序的最左資料進行交換,直到未排序的資料為0,則結束排序。演算法過程如下圖所示 3.1 時間複雜度選擇排序每次需要遍歷未排序的資料,尋找最...

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

堆排序是利用堆進行排序的方法。假設進行公升序排序,則它的基本思想是,將待排序的序列構造成乙個大頂堆,這是乙個建堆的過程。此時,整個序列的最大值就是堆頂的根結點。將它與堆陣列的末尾元素交換,此時末尾元素就是最大值,然後將剩餘的n 1個序列,從根開始進行向下調整,重新構造成乙個堆,這樣就會得到n個元素中...

面試官都在問 Linux命令 grep

grep是乙個文字過濾器,作用是在檔案中查詢符合我們要求的內容。第一種形式,從指定的檔案中找出匹配pattern的行 grep option pattern file1,file2,第二種形式,從管道中找出匹配pattern的行 cmd grep option pattern 說明 pattern是...