日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法-排序-快速排序(包含多种快速排序)

發布時間:2023/12/4 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法-排序-快速排序(包含多种快速排序) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

快速排序

特點:原址排序,最壞的時間復雜度O(n^2)
平均時間復雜度O(nlgn)
比歸并排序系數常數項小
不穩定
底部有最壞時間復雜度為Ω(nlgn)的快速排序地址

void quick_sort(int *array,int start,int end); int partition(int *array,int start,int end);#include "quick_sort.h" void quick_sort(int *array,int start,int end){if(start<end){int k = partition(array,start,end);quick_sort(array,start,k-1);quick_sort(array,k+1,end);} } int partition(int *array,int start,int end){int key = array[end];int p = start - 1;int temp = 0;for (int i = start; i < end; ++i) {if(array[i] <= key){p++;temp = array[p];array[p] = array[i];array[i] = temp;}}array[end] = array[p+1];array[p+1] = key;return p+1; }

反向排序

int reverse_partition(int *array,int start,int end) {int p = start - 1;int key = array[end];for (int i = start; i < end; ++i) {if(array[i] >= key){p++;int temp = array[p];array[p] = array[i];array[i] = temp;}}array[end] = array[p+1];array[p+1] = key;return p+1; } void reverse_quick_sort(int *array,int start,int end){if(start<end){int k = reverse_partition(array,start,end);reverse_quick_sort(array,start,k-1);reverse_quick_sort(array,k+1,end);} }

Hoare 劃分的快速排序

int hoare_partition(int *array,int start,int end){int key = array[start];int left = start - 1;int right = end + 1;while (true){do {right -- ;} while (array[right]>key);do {left++;} while (array[left]<key);if(left<right){int temp = array[left];array[left] = array[right];array[right] = temp;} elsereturn right;} } void hoare_quick_sort(int *array,int start,int end) {if(start<end){int k = hoare_partition(array,start,end);hoare_quick_sort(array,start,k);hoare_quick_sort(array,k+1,end);} }

隨機劃分

int randomized_partition(int *array,int start,int end) {int random = random_include_left_right(start,end);int temp = array[end];array[end] = array[random];array[random] = temp;partition(array,start,end); }

隨機函數代碼

int random_include_left_right(int left,int right){srand((unsigned)time(NULL));return (rand() % (right - left +1))+ left; }

返回兩個參數的劃分 第一個到第二個數之間(包含)的數是等于主元素,并且第一個數前小于主元素,第二個數后是大于主元素

KeyValuePair partition_include_same_element(int *array,int start,int end) {int key = array[end];int left_line = start - 1;int equal_line = left_line;for (int i = start; i < end; ++i) {if(array[i] < key){left_line++;equal_line++;int temp = array[left_line];array[left_line] = array[i];array[i] = temp;}else if(array[i] == key){equal_line++;int temp = array[equal_line];array[equal_line] = array[i];array[i] = temp;}}array[end] = array[equal_line + 1];array[equal_line + 1] = key;equal_line++;return KeyValuePair(left_line+1,equal_line); } KeyValuePair randomized_partition_include_same_element(int *array,int start,int end){int random = random_include_left_right(start,end);int temp = array[random];array[random] = array[end];array[end] = temp;return partition_include_same_element(array,start,end); } void quick_sort_include_same_element(int *array,int start,int end){if(start<end){KeyValuePair keyValuePair = randomized_partition_include_same_element(array,start,end);quick_sort_include_same_element(array,start,keyValuePair.key-1);quick_sort_include_same_element(array,keyValuePair.value+1,end);} }

輔助類KeyValuePair 代碼鏈接

尾遞歸快速排序 時間復雜度在最壞的情況下保持O(nlgn)的時間復雜度

void tail_recursive_quick_sort(int *array,int start,int end) {while (start<end){int middle = partition(array,start,end);if(middle>(start+end)/2){tail_recursive_quick_sort(array,start,middle - 1);start = middle + 1;}else{tail_recursive_quick_sort(array,middle+1,end);end = middle - 1;}} }

時間復雜度為Ω(nlgn)的快速排序
代碼地址

總結

以上是生活随笔為你收集整理的算法-排序-快速排序(包含多种快速排序)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。