1. 程式人生 > 程式設計 >C++實現快速排序(Quicksort)演算法

C++實現快速排序(Quicksort)演算法

本文例項為大家分享了C++快速排序演算法,供大家參考,具體內容如下

一、基本思想是:

通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

二、方法1實現程式:左右兩個方向掃描

// 快速排序:選第一個物件作為基準,按照該物件的排序碼大小,將整個物件
// 序列劃分為左右兩個字序列:
// 左側子序列中所有物件的排序碼都小於或等於基準物件的排序碼;
// 右側子序列中所有物件的排序碼都大於基準物件的排序碼;
// 基準物件則排在這兩個子序列中間,這也是該物件最終應放的位置
// 然後分別對這兩個子序列重複施行上述方法,直到所有的物件都排在相應位置上為止
#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]; // 在被騰空出來的單元(由down指向)中填入arr[up]
  while((down < up) && arr[down] < temp) // 從左向右掃描
   down++;
  if(down < up)
   arr[up--] = arr[down]; // 在被騰空出來的單元(由up指向)中填入arr[down]
 }
 arr[down] = temp; // 最後把基準插回到陣列中間去
 return down;
}
 
// 快速排序演算法
void quickSort(int arr[],int high) {
 // 對序列arr[low]到arr[high]作快速排序
 int mid;
 
 if(low < high) {
  mid = quickPass(arr,low,high); // 對序列arr[low]到arr[high]作一趟快速排序
  quickSort(arr,mid-1); // 對左半部分作遞迴處理
  quickSort(arr,mid+1,high); // 對右半部分作遞迴處理
 }
}
 
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,len-1); // 呼叫快速排序法
 
 std::cout << "排序後:\n";
 for(i = 0; i < len; i++)
  std::cout << arr[i] << " ";
 std::cout << std::endl;
 return 0;
}

執行結果:

C++實現快速排序(Quicksort)演算法

三、方法2:只往一邊掃描

// 快速排序的另一種方法:只往一邊掃描
#include <iostream>
 
// 交換兩個數
void Exchange(int &a,int &b) {
 int temp;
 
 temp = a;
 a = b;
 b = temp;
}
 
// 將序列分為左右兩部分,左部分較小,右部分較大
int Partition(int arr[],int high) {
 int x,i,j;
 
 x = arr[high]; // 以high位置的數作為基準
 i = low - 1;
   // 進行資料分類:左部分較小,右部分較大
 for(j = low; j < high; j++)
  if(arr[j] <= x) { // 往右掃描找小於或者等於基準的數
   i = i + 1;
   Exchange(arr[i],arr[j]); // 交換
  }
 Exchange(arr[i+1],arr[high]); // 把基準放到中間
 return i+1;
}
 
// 快速排序演算法
void quickSort(int arr[],int high) {
 int q;
 
 if(low < high) {
  q = Partition(arr,high);
  quickSort(arr,q-1);
  quickSort(arr,q+1,high);
 }
}
 
int main(int argc,const char * argv[]) {
 int len,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,len-1); // 呼叫快速排序法
 
 std::cout << "排序後:\n";
 for(i = 0; i < len; i++)
  std::cout << arr[i] << " ";
 std::cout << std::endl;
 return 0;
}

執行結果:

C++實現快速排序(Quicksort)演算法

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。