不得不說,快速排序算法就是冒泡排序的升級,而且這個升級算是一個重大的升級了
原理:
找出一個基準數temp(一般爲了方便將數組中的第一個元素作爲基準數)
用兩個指針,low指針指向數組第一個元素,high指向最後一個元素
然後右側尾部開始掃描,當掃描的數大於temp時,high-1,繼續右側往前掃描,當掃描到的數小於基準數時,將這個數賦值給low所指的位置。
然後換左側掃描,左側往前掃描,當掃描的數小於temp時,low+1,繼續左側往右掃描,當掃描到的數大於基準數時,將這個數賦值給high所指的位置。
重複上面的過程,直到low=high結束。
#include "stdio.h"
int sort (int *p , int low , int high);
void quickSort (int *p , int low , int high ) ;
void printIt (int *p , int length);
int main()
{
int a[] = {6,7,1,9,2,5,3,8} ;
int length = sizeof(a)/sizeof(int) ; //數組長度
int *p = a ;
quickSort( p , 0 , length - 1 ) ;
printIt ( p , length) ;
return 0 ;
}
int sort (int *p , int low , int high)
{
//將low看作基準,爲了方便就把數組中的第一個數當作基準
//high指向數組中的最後一個元素
//爲了能夠正常排序必須保證low<high
//當low=high的時候,說明排序結束
int temp = p[low] ;
while (low < high){
//因爲基準是從左邊開始的,那麼比較的時候先從右邊開始讀,開始比較
//快速排序的原理就是找到一個基準,基準放在中間,大於基準的放在基準的右邊,小於基準的放在基準的坐左邊
//當隊尾的元素大於等於基準數據時,向前挪動high指針,即進行high--操作
while (low < high && p[high] >= temp) {
high-- ;
}
//當上面的這個小while循環結束,說明有兩種可能性
//可能性1:low = high ,即內外循環結束的標誌
//可能性2:high的指針開始指向比基準數小的數
if (low < high)
p[low] = p[high] ;//將這個小於基準的數放到左邊
//當右邊找到比基準數小的數的時候再從左邊找,左邊找到比基準數大的數再從右邊找,反覆操作,直到low = high
while (low < high && p[low] <= temp){
low++ ;
}
if(low < high )
p[high] = p[low] ;
}
//此時退出了最外層的循環,說明此時 low = high,即兩個指針指向指在了一起
//那麼此時的指向就是基準數temp的位置
p[low] = temp ;
//p[high] = temp ;
return low ; //將這個基準數的下標返回,便於後面的遞歸調用
}
void quickSort (int *p , int low , int high ) {
if( low < high){
int site = sort(p , low , high) ;
//遞歸調用進行排序
quickSort( p , low , site-1 ) ;
quickSort( p , site+1 , high ) ;
}
}
//定義一個輸出函數
void printIt (int *p , int length){
int i = 0 ;
for ( ; i < length ; i++ )
printf("%d ",p[i]);
printf("\n");
}