C 實現快速排序(第一版)

2021-09-28 20:26:58 字數 1380 閱讀 8576

快速排序作為20世紀最偉大的演算法之一,將排序的時間複雜度降到了o(nlgn),主要使用了分而治之的思想,歸併排序也使用了分而治之的思想。

快速排序的主要思想是找到乙個基準值,將比基準值小的元素放置在基準值左邊,比基準值大的元素放置在基準值右邊。其最重要的函式實現部分是partition函式,該函式不僅在快速排序中發揮了重要作用,在其他演算法中也有使用,另乙個最常見的使用場景是topk問題.。

下面給出partition函式的一種實現方式,以及快速排序**。

#include using namespace std;

// 對 arr[l...r]部分進行partition操作

// 返回p, 使得arr[l...p-1] < arr[p]; arr[p+1...r] > arr[p]

template int __partition(t arr, int l, int r)

}swap(arr[l], arr[j]);

return j;

}

對於乙個給定陣列,在其arr[l...r]範圍內進行partition操作。這裡,為了簡單起見,將基準值設定為該段陣列中的第乙個元素(後續文章會給出優化),當然這裡標準版的應該是要設定成為乙個隨機元素。**中 arr[l+1...j] < v; arr[j+1...i) > v 這句注釋很關鍵,也是我學習該演算法過程中覺得最精髓的表達。對於該段陣列,會將其分成很多段,j+1表示的是大於基準值v的第乙個索引位置。

下面給出快速排序的**:

#include #include using namespace std;

// 對 arr[l...r]部分進行partition操作

// 返回p, 使得arr[l...p-1] < arr[p]; arr[p+1...r] > arr[p]

template int __partition(t arr, int l, int r)

}swap(arr[l], arr[j]);

return j;

}template void __quicksort(t arr, int l, int r)

int p = __partition(arr, l, r);

__quicksort(arr, 1, p-1);

__quicksort(arr, p+1, r);

}template void quicksort(t arr, int n)

int main();

quicksort(arr,8);

for(int i = 0; i<8; i++)

cout

}

第一版Python程式

coding cp936 import os import cpickle as p class person def init self,name,age,self.name name self.age age self.def str self return name self.name age...

MVC面試第一版

mvc流程 1 使用者向伺服器傳送請求,請求被springmvc 前端控制器 dispatcherservlet 捕獲 2 dispatcherservlet對請求url進行解析,得到請求資源識別符號 uri 4 dispatcherservlet 根據獲得的handler,選擇乙個合適的handl...

HomePlay第一版demo發布

一直想做乙個能夠方便跨平台開發的應用框 基礎部分已經完成,於是將這個處於襁褓中的框架應用在win32基礎之上,花了些功夫研究了ffmpeg的使用,做了乙個demo,發布出來吸引批評與建議。框架基礎部分用c語言開發,以dll方式封裝了核心功能以及對ffmpeg的使用部分。出於簡單考慮,外部採用mfc包...