快排是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是...