快速排序(Quicksort)是對冒泡排序的一種改進。由C.
A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進
行,以此達到整個數據變成有序序列。設要排序的數組是A[0]……A[N-1],首先任意選取一個數據(通常選用第一個數據)作爲關鍵數據,然後將所有比
它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱爲一趟快速排序。值得注意的是,快速排序不是一種穩定的排序算法,也就是說,多個相同的值
的相對位置也許會在算法結束時產生變動。
一趟快速排序的算法是:
1)設置兩個變量I、J,排序開始的時候:I=0,J=N-1;
2)以第一個數組元素作爲關鍵數據,賦值給key,即 key=A[0];
3)從J開始向前搜索,即由後開始向前搜索(J=J-1),找到第一個小於key的值A[J],A[j]與A[i]交換;
4)從I開始向後搜索,即由前開始向後搜索(I=I+1),找到第一個大於key的A[I],A[i]與A[j]交換;
5)重複第3、4、5步,直到 I=J; (3,4步是在程序中沒找到時候j=j-1,i=i+1,直至找到爲止。找到並交換的時候i, j指針位置不變。另外當i=j這過程一定正好是i+或j-完成的最後另循環結束。)
例如:待排序的數組A的值分別是:(初始關鍵數據:key=49) 注意關鍵key永遠不變,永遠是和key進行比較,無論在什麼位子,最後的目的就是把X放在中間,小的放前面大的放後面。
A[0] A[1] A[2] A[3] A[4] A[5] A[6]:
49 38 65 97 76 13 27
進行第一次交換後:27 38 65 97 76 13 49
( 按照算法的第三步從後面開始找)
進行第二次交換後:27 38 49 97 76 13 65
( 按照算法的第四步從前面開始找>X的值,65>49,兩者交換,此時:I=3 )
進行第三次交換後:27 38 13 97 76 49 65
( 按照算法的第五步將又一次執行算法的第三步從後開始找
進行第四次交換後:27 38 13 49 76 97 65
( 按照算法的第四步從前面開始找大於X的值,97>49,兩者交換,此時:I=4,J=6 )
#include<iostream.h>
int main()
{
int pa(int a[],int p,int r);
void qs(int a[],int p,int r);
int a[7]={49,38,65,97,76,13,27};
qs(a,0,6);
for(int i=0;i<7;i++)
cout<<a[i]<<" ";
return 0;
}
int pa(int a[],int p,int r)
{
int i=p,j=r+1;
int x=a[p];
while(1)
{
while(a[++i]<x&&i<r);
while(a[--j]>x);
if(i>=j)
break;
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
a[p]=a[j];
a[j]=x;
return j;
}
void qs(int a[],int p,int r)
{
int pa(int a[],int p,int r);
if(p<r)
{
int q=pa(a,p,r);
qs(a,p,q-1);
qs(a,q+1,r);
}
}
int main()
{
int pa(int a[],int p,int r);
void qs(int a[],int p,int r);
int a[7]={49,38,65,97,76,13,27};
qs(a,0,6);
for(int i=0;i<7;i++)
cout<<a[i]<<" ";
return 0;
}
int pa(int a[],int p,int r)
{
int i=p,j=r+1;
int x=a[p];
while(1)
{
while(a[++i]<x&&i<r);
while(a[--j]>x);
if(i>=j)
break;
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
a[p]=a[j];
a[j]=x;
return j;
}
void qs(int a[],int p,int r)
{
int pa(int a[],int p,int r);
if(p<r)
{
int q=pa(a,p,r);
qs(a,p,q-1);
qs(a,q+1,r);
}
}