基本演算法-》快速排序(c++實現)
阿新 • • 發佈:2019-02-17
演算法:1 在要排序的無序演算法中,選出一個元素作為標誌。(通常這個標誌選擇陣列中的第一個元素)
選完標誌後,先從左向右找出小於標誌的值,將他的值付給陣列中標誌下標的值,然後再從右向左查詢小於標誌的值,然後把小於標誌的值,付給之前大於標誌的下標的值。(就是把小於標誌的值放在標誌值的左邊,大於標誌的值放在標誌值的右邊,這樣每個函式執行完後,左邊就是小於標誌值的事,右邊就是大於標誌值的事),然後再遞迴呼叫 程式碼如下:
#include <iostream> using namespace std; template<typename T> void quicksort(T *a,int l,int r)//l,r分別代表左右邊界 { if(l<r) { T x=a[l]; int i=l; int j=r; while(i<j) {//第一遍 while(i<j&&a[i]<a[j])// 從右往左找小於a[i]的j的值 { j--; } if(i<j)//證明找到了 { a[i++]=a[j];//直接把a[j]的值賦給a[i],這是陣列中a[i]的值不存在了,但x保留著它的值,此時陣列中有兩個a[j]的值 }//此時如果沒找到,j=i; //第二遍,從左向右找大於x的值,並且把它的值賦給a[j] while(i<j&&a[i]<a[j]) { i++; } if(i<j)//證明找到了 { a[j--]=a[i];//把a[i]的值賦給a[j],此時陣列中,含有兩個a[i]的值,沒有x的值,所以最後我們把x賦給a[i]這樣陣列內的元素就又都全了 } //每次迴圈到這時都是a[i]有兩個值,所以為了節約資源,我們在迴圈外,把x的值賦給a[i] } a[i]=x; //呼叫遞迴 quicksort(a,l,i-1);//從左到x再排序 quicksort(a,i+1,r);//從右到x再排序 } } int main() { int a[5]={2,4,1,5,7}; for(int i=0;i<5;i++) { cout<<a[i]<<" "; } cout<<endl; quicksort(a,0,4); for(int i=0;i<5;i++) { cout<<a[i]<<" "; } cout<<endl; }