快速排序

昨天學了冒泡排序,今天我們大家來學習一下快速排序。

在寫這個之前,我也是察看了很多博客的,十分感謝博主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
此時:i=1;j=8;X=72

那麼我們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
通過上述變化,我們是不是把72放到了中間,左邊0-4的位置上都是比72小的數字,而右邊6-9都是比72大的數字。


接下來我們得遞歸了,對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);
	}
}
執行結果爲:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章