面試時經常被提問到的——快速排序算法

不得不說,快速排序算法就是冒泡排序的升級,而且這個升級算是一個重大的升級了

原理:

找出一個基準數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");
} 

在這裏插入圖片描述

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