學習筆記 快速排序

2022-07-20 07:15:08 字數 1873 閱讀 7331

排序(sorting)的功能是將乙個資料元素的任意序列,重寫排列成乙個按關鍵字有序的序列。

一類是整個排序過程在記憶體儲器中進行,成為內部排序

另一類是由於待排序元素數量太大,以至於記憶體儲器無法容納全部資料,排序需要借助外部儲存裝置才能完成,這類排序成為外部排序。

穩定排序:假設在待排序的檔案中,存在兩個或兩個以上的記錄具有相同的關鍵字,在用某種排序法排序後,若這些相同關鍵字的元素的相對次序仍然不變,則這種排序方法是穩定的。

其中冒泡,插入,基數,歸併屬於穩定排序,選擇,快速,希爾,歸屬於不穩定排序。

就地排序:若排序演算法所需的輔助空間並不依賴於問題的規模n,即輔助空間為o(1),則稱為就地排序。

大部分排序都是需要通過比較首先來判斷大小,作為排序的依據的。

但是也有例外的,比如計數排序、基數排序,不需要進行比較。

時間複雜度最高的就是三種基本排序:直接插入、簡單選擇、氣泡排序。

氣泡排序的改進版,也是最好的一種內排序,還涉及到分治和遞迴。

是由c. a. r. hoare在2023年提出的一種劃分交換排序,它採用了一種分治的策略,通常稱其為分治法(divide-and-conquermethod)。

它的基本思想是:

通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,

然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

一趟快速排序的演算法是:

1)設定兩個變數i、j,排序開始的時候:i=0,j=n-1;

2)以第乙個陣列元素作為關鍵資料,賦值給key,即key=a[0];

3)從j開始向前搜尋,即由後開始向前搜尋(j--),找到第乙個小於key的值a[j],將值為key的項與a[j]交換;

4)從i開始向後搜尋,即由前開始向後搜尋(i++),找到第乙個大於key的a[i],將值為key的項與a[i]交換;

5)重複第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中a[j]不小於key,4中a[j]不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進行交換的時候i, j指標位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令迴圈結束)。

public

static

void quicksort(int

arr)

private

static

void quicksort(int arr,int low, int

high)

}private

static

int partition(int arr,int low,int

high)

//2.將右側找到小於基準數的值加入到左邊的位置,左指標向中間移動乙個位置i++

if( i

//3.從左向右移動i,找到第乙個大於等於基準值的值 arr[i]

while(arr[i] < x && i

//4.將左側找到的大於等於基準的值加入到右邊,右指標向中間移動乙個位置 j--

if(i

}//使用基準值,這就是基準值的最終位置

arr[i] =x;

//返回基準值的位置索引

return

i; }

快速排序學習筆記

學習資料出處 白話經典演算法系列之六 快速排序 快速搞定 快速排序採用分治策略,其基本思想 1 從數列中選乙個元素x作為基準數 2 分割槽過程,把不小於x的元素放到x的右邊,小於x的元素放到x的左邊 3 再對左右區間重複進行分割槽操作,直到各區間只有乙個數 morewindows總結的 挖坑填數 分...

學習筆記 快速排序

基本步驟 1 確定分界點x a l a r a l r 1 2 劃分區間 小於x的在一邊,大於x的在另一邊 3 遞迴處理左右兩端 const int n 1e5 5 int n,a n void quick sort int a,int l,int r quick sort a,l,j quick ...

學習筆記 快速排序

將乙個一維陣列從小到大排列。快速排序利用了遞迴的思想。需要三個引數,陣列本身,陣列起始索引也就是0,陣列最右索引,也就是陣列長度 1。簡單來說,快速排序的思想是這樣的,先選擇乙個數作為基準數,把比它小的都移動到左邊,把比它大的都移動到右邊,然後針對左邊這個子陣列,再選擇乙個基準數,比它小的移到左邊,...