昨天學了冒泡排序,今天我們大家來學習一下快速排序。
在寫這個之前,我也是察看了很多博客的,十分感謝博主http://www.cnblogs.com/morewindows/archive/2011/08/13/2137415.html
http://blog.csdn.net/morewindows/article/details/6684558
http://blog.sina.com.cn/s/blog_5c5bc9070100y4zv.html
——————————————————————————————————————————————————————————————————————————
快速排序
概念:採取了分治策略。思想是:1.先從數列中選取一個數作爲基準數 2.在分區時,將比這個數大的數都放在這個數的右邊,比他小的或等於他的都放在他的左邊。
3.在對左右區間都分別重複第二步,直到各個區間只有一個數。
————————————————————————————————————————————————————————————————————————————
好理解的挖坑填數+分治法:
挖坑填數:
先給一個數組:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
72 | 6 | 57 | 88 | 60 | 42 | 83 | 73 | 48 | 85 |
這個數組中,我們隨便選取一個數,比如說0位置的72,那麼我們在程序中,初始設置i=0;j=9;X=a[i]=72;(我們把一個額外的坑作爲中間倒騰的地方,假設爲X,i,j分別表示位置)
剛開始我們把a[0]=72的值放到了X的坑裏,那a[0]這個坑就已經空着了,數組變成了:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
6 | 57 | 88 | 60 | 42 | 83 | 73 | 48 | 85 |
那麼我們是不是要找比72小的數填到他的左邊, 比72的數大的放到他的右邊?可以這樣操作:j=9,從後往前找一個比72小的數放到a[0],我們發現當j=8時,48<72,所以我們把48填到a[0]的位置,程序描述爲:a[0]=a[8],i++;數組變爲:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
48 | 6 | 57 | 88 | 60 | 42 | 83 | 73 | 85 |
那麼我們a[8]的位置空出來了,我們要找比72大的數了,我們從i開始向後找大於72的數,當i=3時,88>72,符合條件,那麼我們把a[8]=a[3];j--;數組變爲:
此時 i=3,j=8;X=72
我們再重複上面的步驟,當j=5時,我們發現42<72,a[3]=a[5],i++;
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
48 | 6 | 57 | 42 | 60 | 83 | 73 | 88 | 85 |
此時i=5;j=5;X=72;由於i=j,所以把X填到a[5]中,此時數組變爲:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
48 | 6 | 57 | 42 | 60 | 72 | 83 | 73 | 88 | 85 |
接下來我們得遞歸了,對a[0]-a[4]區間,和a[6]-a[9]這兩個子區間重複上述步驟。
好啦,接下來總結一下遞歸算法的文字描述吧:
1.i=L,j=R,將基數挖出形成第一個坑a[i];
2.j--;從後向前,找到一個比基數小的數,找到後把這個數填到a[i]中;
3.i++由前向後找到比它大的數,找到後把這個數挖出放到剛剛空出來的a[j]中;
4.重複2~3,直到i=j,將基數填到a[i]中。
明白了原理我們開始用代碼實現一下吧:(實現暫時還沒有運行~等後面我運行了在寫。。。。。)
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
void quicksort(int a[],int l,int r);
int main()
{
int a[10]={34,65,12,43,67,5,78,10,3,70};
int len=sizeof(a)/sizeof(int);
cout<<"the orginal array are"<<endl;
for(int i=0;i<len;i++)
{
cout<<a[i]<<',';
}
cout<<endl;
quicksort(a,0,len-1);
cout<<"the sorted array are"<<endl;
for(int i=0;i<len;i++)
{
cout<<a[i]<<',';
}
cout<<endl;
return 0;
}
void quicksort(int a[],int l,int r)
{
if(l<r)
{
int i=l;
int j=r;
int x;
x=a[l];
while(i<j)
{
while(i<j&&a[j]>x)
{
j--;
}
if(i<j)
{
a[i]=a[j];
i++;
}
while(i<j&&a[i]<x)
{
i++;
}
if(i<j)
{
a[j]=a[i];
j--;
}
}
a[i]=x;
quicksort(a,l,i-1);//遞歸調用
quicksort(a,i+1,r);
}
}
執行結果爲: