1. 程式人生 > 其它 >快速排序(比希爾排序還要快)

快速排序(比希爾排序還要快)

程式碼

	public static void quickSort(int[] arr,int left,int right){
		int l = left;
		int r = right;
		//pivot 中軸值
		int pivot = arr[(left + right) / 2];
		int temp = 0;
		//while迴圈的目的是讓比pivot值小的放左邊,比pivot值大的放右邊
		while(l < r){
			//在pivot左邊一直找,找到大於等於pivot值,才退出
			while(arr[l] < pivot){
				l += 1;
			}
			//在pivot右邊一直找,找到大於等於pivot值,才退出
			while(arr[r] > pivot){
				r -= 1;
			}
			//如果l >= r,說明左邊都是<=pivot的值,右邊都是>=pivot的值
			if(l >= r){
				break;
			}
			//交換
			temp = arr[l];
			arr[l] = arr[r];
			arr[r] = temp;
			
			//如果交換完後,發現這個arr[l] == pivot,那麼r前移
			if(arr[l] == pivot){
				r -= 1;
			}
			//如果交換完後,發現這個arr[r] == pivot,那麼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);
		}
	}

效率

	//8000 0000 17781ms
	//800 0000 1632ms
	//80 0000 154ms
	//8 0000 27ms