最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)快速排序(Quicksort)算法

 更新時(shí)間:2020年04月27日 17:05:07   作者:ChanJose  
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)快速排序(Quicksort)算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(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)文章

最新評(píng)論

新余市| 伊宁县| 定结县| 邹城市| 深州市| 新竹市| 孙吴县| 广德县| 昌宁县| 开原市| 津南区| 九龙坡区| 珠海市| 西林县| 汉中市| 米林县| 安康市| 横峰县| 中西区| 通化县| 阿克| 辰溪县| 外汇| 大姚县| 松江区| 云浮市| 方城县| 娱乐| 磐安县| 巴彦县| 滕州市| 鄂伦春自治旗| 乌鲁木齐县| 文登市| 法库县| 安丘市| 黔江区| 奉新县| 荔波县| 平顶山市| 和硕县|