1. 程式人生 > >基本演算法-》快速排序(c++實現)

基本演算法-》快速排序(c++實現)

演算法: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;

}