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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

排序算法:快速排序算法实现及分析(递归形式和非递归形式)

發布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 排序算法:快速排序算法实现及分析(递归形式和非递归形式) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

快速排序算法介紹

從名字上就可以看出快速排序算法很囂張,直接以快速命名。確實快速排序 的確很快速,被列為20世紀十大算法之一。程序員難道不應該掌握么快速排序(Quick Sort)的基本思想是:通過一趟排序將待排序記錄分割成獨立的2部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小,則可分別對這2部分分記錄繼續進行排序,以達到整個序列有序的目的。沒有理解?沒關系,下面看圖解快速排序可以用遞歸的形式當然任何遞歸形式的代碼都可以改用 棧 或者隊列這種數據結構進行改造,下面也有非遞歸形式的快速排序代碼 當然要比遞歸形式代碼要復雜一點

圖解快速排序算法


快速排序算法遞歸代碼實現

代碼不是很多,還是那個邏輯 將比基準數小的往前移,比基準數大的往后,將基準數放到正確的位置。然后進行遞歸分治遞歸形式的代碼比較容易理解

//快速排序 升序 遞歸形式 void QuickSort_Up_Recursion(int *arr, int start, int end) {int i = start;int j = end;int temp = arr[i];//基準數if (i < j){while (i < j){//從后往前找 比基準數小的下標while (i < j&& arr[j] >= temp){j--;}//將比基準數 小的往前移if (i < j){arr[i] = arr[j];i++;}//從前往后找 比基準數大的下標while (i < j&& arr[i] < temp){i++;}//將比基準數 大的往后移if (i < j){arr[j] = arr[i];j--;}}//while循環完畢i == jarr[i] = temp;//將基準數放到它的正確位置,現在它左邊的數都比它小,他右邊的數都比它大。QuickSort_Up_Recursion(arr, start, i - 1);//將它左邊的序列 進行快排QuickSort_Up_Recursion(arr, i + 1, end);//將它右邊的序列 進行快排} }

快速排序算法非遞歸代碼實現

因為遞歸需要函數的彈棧壓棧 對 棧內存開銷比較大,請記住 任何形式的遞歸,只要是遞歸都可以通過隊列或者棧數據結構去完成,我們自己封裝的隊列或者棧內存開辟實在堆當中所以不會對棧空間進行太大的開銷。下面采用隊列數據結構對快速排序的遞歸代碼進行改造。隊列采用的是自己底層封裝的代碼,不明白請看順序隊列

//將基準數 放到它該有的位置 void QuickSort_Up_BaseNum(int *arr, int start, int end, int* mid) {int i = start;int j = end;int temp = arr[i];//基準數if (i < j){while (i < j){//從后往前找 比基準數小的下標while (i < j&& arr[j] >= temp){j--;}//將比基準數 小的往前移if (i < j){arr[i] = arr[j];i++;}//從前往后找 比基準數大的下標while (i < j&& arr[i] < temp){i++;}//將比基準數 大的往后移if (i < j){arr[j] = arr[i];j--;}}//while循環完畢i == jarr[i] = temp;//將基準數放到它的正確位置,現在它左邊的數都比它小,他右邊的數都比它大。*mid = i;//printf("基準數:%d\n", temp);//PrintArr(arr, 10);} }//快速排序非遞歸形式 升序 //用隊列或者棧 都是可以的 因為 先分治左邊 或者 先分治右邊 沒有先后順序的要求 void QuickSort_Up_Nonrecursion(int* arr, int start, int end) {SeqQueue queue = Init_SeqQueue();int* start1 = malloc(sizeof(int));int* end2 = malloc(sizeof(int));*start1 = start;*end2 = end;Push_SeqQueue(queue, start1);Push_SeqQueue(queue, end2);int mid;//臨時變量while (!IsEmpty_SeqQueue(queue)){start1 = Pop_SeqQueue(queue);end2 = Pop_SeqQueue(queue);if (*start1 < *end2){//printf("(%d,%d) ", *start1, *end2);QuickSort_Up_BaseNum(arr, *start1, *end2, &mid);int* end1 = malloc(sizeof(int));int* start2 = malloc(sizeof(int));*end1 = mid - 1;*start2 = mid + 1;if (*start2 < *end2){Push_SeqQueue(queue, start2);Push_SeqQueue(queue, end2);}if (*start1 < *end1){Push_SeqQueue(queue, start1);Push_SeqQueue(queue, end1);}}} }


完整代碼

其他排序算法代碼請看,希爾排序,堆排序,歸并排序

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h> #include <sys/timeb.h> //#include "AllSort.h" #include "SeqQueue.h" #define MAXSIZE 1000000//打印數組元素 void PrintArr(int* arr, int length) {for (int i = 0; i < length; i++){printf("%d ", arr[i]);}printf("\n");return; } //獲取系統時間 long GetSysTime() {struct timeb time;ftime(&time);return time.time * 1000 + time.millitm;; }//快速排序 升序 遞歸形式 void QuickSort_Up_Recursion(int *arr, int start, int end) {int i = start;int j = end;int temp = arr[i];//基準數if (i < j){while (i < j){//從后往前找 比基準數小的下標while (i < j&& arr[j] >= temp){j--;}//將比基準數 小的往前移if (i < j){arr[i] = arr[j];i++;}//從前往后找 比基準數大的下標while (i < j&& arr[i] < temp){i++;}//將比基準數 大的往后移if (i < j){arr[j] = arr[i];j--;}}//while循環完畢i == jarr[i] = temp;//將基準數放到它的正確位置,現在它左邊的數都比它小,他右邊的數都比它大。QuickSort_Up_Recursion(arr, start, i - 1);//將它左邊的序列 進行快排QuickSort_Up_Recursion(arr, i + 1, end);//將它右邊的序列 進行快排} }//將基準數 放到它該有的位置 void QuickSort_Up_BaseNum(int *arr, int start, int end, int* mid) {int i = start;int j = end;int temp = arr[i];//基準數if (i < j){while (i < j){//從后往前找 比基準數小的下標while (i < j&& arr[j] >= temp){j--;}//將比基準數 小的往前移if (i < j){arr[i] = arr[j];i++;}//從前往后找 比基準數大的下標while (i < j&& arr[i] < temp){i++;}//將比基準數 大的往后移if (i < j){arr[j] = arr[i];j--;}}//while循環完畢i == jarr[i] = temp;//將基準數放到它的正確位置,現在它左邊的數都比它小,他右邊的數都比它大。*mid = i;//printf("基準數:%d\n", temp);//PrintArr(arr, 10);} }//快速排序非遞歸形式 升序 //用隊列或者棧 都是可以的 因為 先分治左邊 或者 先分治右邊 沒有先后順序的要求 void QuickSort_Up_Nonrecursion(int* arr, int start, int end) {SeqQueue queue = Init_SeqQueue();int* start1 = malloc(sizeof(int));int* end2 = malloc(sizeof(int));*start1 = start;*end2 = end;Push_SeqQueue(queue, start1);Push_SeqQueue(queue, end2);int mid;//臨時變量while (!IsEmpty_SeqQueue(queue)){start1 = Pop_SeqQueue(queue);end2 = Pop_SeqQueue(queue);if (*start1 < *end2){//printf("(%d,%d) ", *start1, *end2);QuickSort_Up_BaseNum(arr, *start1, *end2, &mid);int* end1 = malloc(sizeof(int));int* start2 = malloc(sizeof(int));*end1 = mid - 1;*start2 = mid + 1;if (*start2 < *end2){Push_SeqQueue(queue, start2);Push_SeqQueue(queue, end2);}if (*start1 < *end1){Push_SeqQueue(queue, start1);Push_SeqQueue(queue, end1);}}} }int main(int argc, char *argv[]) {srand((size_t)time(NULL));//設置隨機種子int arr0[10] = { 6,8,2,3,9,7,4,1,5,10 };int arr1[10] = { 4,1,10,3,9,7,5,6,8,2 };int len0 = sizeof(arr0) / sizeof(arr0[0]);int len1 = sizeof(arr1) / sizeof(arr1[0]);int *arr2 = (int*)malloc(sizeof(int)*MAXSIZE);//希爾排序int *arr3 = (int*)malloc(sizeof(int)*MAXSIZE);//堆排序int *arr4 = (int*)malloc(sizeof(int)*MAXSIZE);//歸并排序int *temp = (int*)malloc(sizeof(int)*MAXSIZE);//歸并排序 輔助空間int *arr5 = (int*)malloc(sizeof(int)*MAXSIZE);//快速排序for (int i = 0; i < MAXSIZE; i++){arr2[i] = rand() % MAXSIZE;arr3[i] = rand() % MAXSIZE;arr4[i] = rand() % MAXSIZE;arr5[i] = rand() % MAXSIZE;}printf("排序前arr0:\n");PrintArr(arr0,len0);printf("排序前arr1:\n");PrintArr(arr1, len1);printf("arr0快速排序升序[遞歸形式]:\n");QuickSort_Up_Recursion(arr0, 0, len0 - 1);PrintArr(arr0, len0);printf("arr1快速排序升序[非遞歸形式]:\n");QuickSort_Up_Nonrecursion(arr1, 0, len1 - 1);PrintArr(arr1, len1);/*long start1 = GetSysTime();ShellSort_Up(arr2,MAXSIZE);long end1 = GetSysTime();printf("%d個數據 希爾排序耗費時間%d毫秒\n",MAXSIZE,end1-start1);long start2 = GetSysTime();HeapSort_Up(arr3,MAXSIZE);long end2 = GetSysTime();printf("%d個數據 堆排序耗費時間%d毫秒\n",MAXSIZE,end2-start2);long start3 = GetSysTime();MergeSort_Up(arr4, 0, MAXSIZE - 1, temp);long end3 = GetSysTime();printf("%d個數據 歸并排序耗費時間%d毫秒\n",MAXSIZE,end3-start3); long start4 = GetSysTime();QuickSort_Up(arr5, 0, MAXSIZE - 1);long end4 = GetSysTime();printf("%d個數據 快速排序耗費時間%d毫秒\n",MAXSIZE,end4-start4);*/return 0; }

代碼運行檢測

正確性校驗


和希爾排序、堆排序、歸并排序 比較

用同樣隨機數字數組測試100萬個數字元素,還是快排最快。



總結

以上是生活随笔為你收集整理的排序算法:快速排序算法实现及分析(递归形式和非递归形式)的全部內容,希望文章能夠幫你解決所遇到的問題。

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