本文詳細敘述和實現了快速排序算法,冒泡排序 選擇排序 插入排序比較簡單,原理在這裡不再詳述,直接用代碼進行了實現。
快速排序法(quicksort)是目前所公認最快的排序方法之一(視解題的對象而定),雖然快速排序法在最差狀況下可以達O(n2),但是在多數的情況下,快速排序法的效率表現是相當不錯的。快速排序法的基本精神是在數列中找出適當的軸心,然後將數列一分為二,分別對左邊與右邊數列進行排序,而影響快速排序法效率的正是軸心的選擇。
這邊所介紹的第一個快速排序法版本,是在多數的教科書上所提及的版本,因為它最容易理解,最符合軸心分割與左右進行排序的概念,適合對初學者進行講解。
解法這邊所介紹的快速演算如下:將最左邊的數設定為軸,並記錄其值為s
廻圈處理:
令索引i 從數列左方往右方找,直到找到大於s 的數
令索引j 從數列左右方往左方找,直到找到小於s 的數
如果i>=j,則離開回圈
如果i<j,則交換索引i與j兩處的值
將左側的軸與j 進行交換
對軸左邊進行遞回
對軸右邊進行遞回
透過以下演算法,則軸左邊的值都會小於s,軸右邊的值都會大於s,如此再對軸左右兩邊進行
遞回,就可以對完成排序的目的,例如下面的實例,*表示要交換的數,[]表示軸:
[41] 24 76* 11 45 64 21 69 19 36*
[41] 24 36 11 45* 64 21 69 19* 76
[41] 24 36 11 19 64* 21* 69 45 76
[41] 24 36 11 19 21 64 69 45 76
21 24 36 11 19 [41] 64 69 45 76
算法實現c/c++版:
/*快速排序法
sort 函數說明,添加者 Steve;
left:數組a的最小下標;
right:數組a的最大下標;
a[]:數組;
N:數組長度
*/
void sort(int left,int right ,int a[],int N)
{
if (left<right)
{
int al=left;
int ar=right+1;
int aleft=a[left];
while(1)
{
while((al+1<N)&&(aleft>a[++al]));
while((ar-1>-1)&&(aleft<a[--ar]));
if (al>=ar)
{
break;
}
int temp=a[al];
a[al]=a[ar];
a[ar]=temp;
}
a[left]=a[ar];
a[ar]=aleft;
sort(left,ar-1,a,N);
sort(ar+1,right,a,N);
}
}
//冒泡排序法
void bufferSort(int a[],int N)
{
for (int i=0;i<N-1;i++)
for(int j=0;j<N-i-1;j++)
{
if (a[j]>a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
//選擇排序法
void SelectSort(int a[],int N)
{
for (int i=0;i<N-1;i++)
{
int Min=a[i];
int index=i;
for(int j=i+1;j<N;j++)
if (Min>a[j])
{
Min=a[j];
index=j;
}
a[index]=a[i];
a[i]=Min;
}
}
//插入排序法
void inserSort(int a[],int N)
{
for ( int i=1;i<N;i++ )
{
int temp=a[i];
int j=i-1;
while(temp<a[j])
{
a[j+1]=a[j];
j--;
if(j<0)
break;
}
a[j+1]=temp;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[]={-2,3,4,-9};
cout<<" 排序前"<<endl;
for (int i=0;i<4;i++)
{
cout<<a[i]<<" ";
}
cout<<endl<<"排序後"<<endl;
//sort(0,3,a,4);//快速排序
// bufferSort(a,4);//冒泡排序
// SelectSort(a,4);//選擇排序
inserSort(a,4);
for (int i=0;i<4;i++)
{
cout<<a[i]<<" ";
}
return 0;
}