排序算法-快速排序(Java)

快速排序

快速排序是對冒泡排序的一種改進,基本思想是:通過一趟排序將要排序的數據分割成獨立的兩個部分,其中一部分的所有數據都比另一部分的所有數據都小,從而按照此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行
快排示意圖
在這裏插入圖片描述
在這裏插入圖片描述
快排代碼實現

	public static void quickSort(int [] arr,int left,int right){
		int l = left;//左下標
		int r = right;//右下標
		int pivot = arr[(left + right) / 2];//中軸值
		int temp = 0;//臨時變量
		//while循環目的是讓比中軸值小的放左面,大的放右面
		while(l < r){
			//從左面循環直到找到比中軸值大的元素
			while(arr[l] < pivot){
				l += 1;
			}
			//從右面循環直到找到比中軸值小的元素
			while(arr[r] > pivot){
				r -= 1;
			}
			if(l >= r){//如果左右座標越界了就退出循環
				break;
			}
			//交換數值
			temp = arr[l];
			arr[l] = arr[r];
			arr[r] = temp;
			//如果交換完成後發現值相等,則r--操作,前移:因爲左側的值是右側交換過來的
			if(arr[l] == pivot){
				r -= 1;
			}
			//如果交換完成後發現值相等,則l++操作,後移:因爲右側的值是左側交換過來的
			if(arr[r] == pivot){
				l += 1;
			}
			//上面的操也可寫在最開始的循環判斷上加上=
		}
		if(l == r){//用於當作下面遞歸的左右指針條件,不執行自增或自減,會棧溢出
			l += 1;
			r -= 1;
		}
		if(left < r){//看指針是否在左面
			quickSort(arr,left,r);
		}
		if(right > l){//看執政是否在右面
			quickSort(arr,l,right);
		}
	}

下面是對遞歸中的判斷條件的圖解分析
在這裏插入圖片描述

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