C++實(shí)現(xiàn)快速排序(Quicksort)算法
本文實(shí)例為大家分享了C++快速排序算法,供大家參考,具體內(nèi)容如下
一、基本思想是:
通過(guò)一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過(guò)程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。
二、方法1實(shí)現(xiàn)程序:左右兩個(gè)方向掃描
// 快速排序:選第一個(gè)對(duì)象作為基準(zhǔn),按照該對(duì)象的排序碼大小,將整個(gè)對(duì)象 // 序列劃分為左右兩個(gè)字序列: // 左側(cè)子序列中所有對(duì)象的排序碼都小于或等于基準(zhǔn)對(duì)象的排序碼; // 右側(cè)子序列中所有對(duì)象的排序碼都大于基準(zhǔn)對(duì)象的排序碼; // 基準(zhǔn)對(duì)象則排在這兩個(gè)子序列中間,這也是該對(duì)象最終應(yīng)放的位置 // 然后分別對(duì)這兩個(gè)子序列重復(fù)施行上述方法,直到所有的對(duì)象都排在相應(yīng)位置上為止 #include <iostream> // 一次快速排序算法 int quickPass(int arr[], int low, int high) { int down, up, temp; down = low; up = high; temp = arr[low]; while(down < up) { while((down < up) && arr[up] >= temp) // 從右向左掃描 up--; if(down < up) arr[down++] = arr[up]; // 在被騰空出來(lái)的單元(由down指向)中填入arr[up] while((down < up) && arr[down] < temp) // 從左向右掃描 down++; if(down < up) arr[up--] = arr[down]; // 在被騰空出來(lái)的單元(由up指向)中填入arr[down] } arr[down] = temp; // 最后把基準(zhǔn)插回到數(shù)組中間去 return down; } // 快速排序算法 void quickSort(int arr[], int low, int high) { // 對(duì)序列arr[low]到arr[high]作快速排序 int mid; if(low < high) { mid = quickPass(arr, low, high); // 對(duì)序列arr[low]到arr[high]作一趟快速排序 quickSort(arr, low, mid-1); // 對(duì)左半部分作遞歸處理 quickSort(arr, mid+1, high); // 對(duì)右半部分作遞歸處理 } } int main(int argc, const char * argv[]) { // insert code here... int len, i; int arr[] = {40, 30, 60, 90, 70, 10, 20, 40}; len = sizeof(arr) / sizeof(arr[0]); std::cout << "排序前:\n"; for(i = 0; i < len; i++) std::cout << arr[i] << " "; std::cout << std::endl; quickSort(arr, 0, len-1); // 調(diào)用快速排序法 std::cout << "排序后:\n"; for(i = 0; i < len; i++) std::cout << arr[i] << " "; std::cout << std::endl; return 0; }
運(yùn)行結(jié)果:
三、方法2:只往一邊掃描
// 快速排序的另一種方法:只往一邊掃描 #include <iostream> // 交換兩個(gè)數(shù) void Exchange(int &a, int &b) { int temp; temp = a; a = b; b = temp; } // 將序列分為左右兩部分,左部分較小,右部分較大 int Partition(int arr[], int low, int high) { int x, i, j; x = arr[high]; // 以high位置的數(shù)作為基準(zhǔn) i = low - 1; // 進(jìn)行數(shù)據(jù)分類:左部分較小,右部分較大 for(j = low; j < high; j++) if(arr[j] <= x) { // 往右掃描找小于或者等于基準(zhǔn)的數(shù) i = i + 1; Exchange(arr[i], arr[j]); // 交換 } Exchange(arr[i+1], arr[high]); // 把基準(zhǔn)放到中間 return i+1; } // 快速排序算法 void quickSort(int arr[], int low, int high) { int q; if(low < high) { q = Partition(arr, low, high); quickSort(arr, low, q-1); quickSort(arr, q+1, high); } } int main(int argc, const char * argv[]) { int len, i; int arr[] = {40, 30, 60, 90, 70, 10, 20, 40}; len = sizeof(arr) / sizeof(arr[0]); std::cout << "排序前:\n"; for(i = 0; i < len; i++) std::cout << arr[i] << " "; std::cout << std::endl; quickSort(arr, 0, len-1); // 調(diào)用快速排序法 std::cout << "排序后:\n"; for(i = 0; i < len; i++) std::cout << arr[i] << " "; std::cout << std::endl; return 0; }
運(yùn)行結(jié)果:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)掃雷游戲詳細(xì)代碼
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷游戲的具體步驟和詳細(xì)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11C語(yǔ)言中回調(diào)函數(shù)的含義與使用場(chǎng)景詳解(2)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言中回調(diào)函數(shù)的含義與使用場(chǎng)景,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03Linux線程同步之信號(hào)C語(yǔ)言實(shí)例
這篇文章主要介紹了Linux線程同步之信號(hào)C語(yǔ)言實(shí)例,本文直接給出代碼實(shí)例,需要的朋友可以參考下2015-04-04C語(yǔ)言中讀寫交替時(shí)出現(xiàn)的問(wèn)題分析
讀寫命令交替,一定要使用fseek重新定位,否則出現(xiàn)輸入顯示混亂,這篇文章主要介紹了C語(yǔ)言中讀寫交替時(shí)出現(xiàn)的問(wèn)題分析,需要的朋友可以參考下2022-12-12