快速排序和冒泡排序-Java版-面試常問

八大排序裏面經常讓寫的兩個就是快排和冒泡,面試經常會遇到,mark一下。

冒泡,兩個兩個比較,前一個大於後一個,則把大的挪到後面,第一趟有n個元素,需要比較n-1次;第二趟n-1個元素,比較n-2次。所以,內層循環是length-i   再-1。

public static void main(String[] args){
	int[] arr = {1,5,3,8,4,9,5,5,6,7,2,88,54,666,47};
	for(int i = 0; i < arr.length; i++){
		for(int j = 0; j < arr.length - i - 1 ;j++){
			if(arr[j] > arr[j+1]){
				int temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp;
			}
		}

	}

	for(int i =0; i< arr.length;i++){
		if(i == arr.length-1){
			System.out.print(arr[i]+",");
		}else{
			System.out.print(arr[i]);
		}
		
	}
}

快排

快排的思想是這樣:arr爲待排序數組,傳入的值爲arr,low,high。

每一輪,都需要調用一次quciksort

  • 每輪排序都把第一個元素作爲基準,記爲pivot。每一輪我們都要做到讓arr[pivot]左邊的元素全小於arr[pivot],右邊的全大於arr[piovt]。這樣arr[pivot]就不用排序了,只需要遞歸地排序arr坐邊和右邊的兩個序列,即調用quickSort(arr, low, pivot - 1)和quickSort(arr, pivot + 1, high)即可。
  • 每一輪內的思路爲,遍歷座標i的元素,直到遇到第一個大於arr[povit]的元素,否則i++。遍歷座標j的元素,直到遇到一個小於arr[povit],否則j++。因爲後面遞歸的時候需要用到low和high,不希望low和high被改變,所以循環的時候用i和j替代low和high,循環的條件是 i<j ,這裏不能取等。

每一輪的具體操作如下

取兩個下標i和j,其中i爲arr的起始元素,j爲末尾元素。

循環的時候不用for循環,而是去用while(),while()內的循環條件不僅要保證arr[j] > arr[pivot] 且還需要保證 i<j.

比較arr[j] 和arr[pivot] 的值,arr[i] 和arr[pivot] 的值。

這個時候得到了i和j的值,需要進行交換,但交換之前需要判斷一下i是否小於j,是的話繼續循環,i=j的時候循環結束,此時i<j。因爲可能會出現i和j碰頭之後,繼續向前走的情況,即i等於j,這時說明不用交換,pivot左邊的數已經全部小於arr[pivot]的值了,且右邊的值全部大於arr[pivot]。

這時i就是小於pivot的值,交換arr[i] 和arr[pivot]

public static void main(String[] args){

	int[] arr ={1,5,3,8,4,9,5,5,6,7,2,88,54,666};
	quickSort(arr, 0, arr.length -1);
	for(int i =0; i< arr.length;i++){
		if(i == arr.length-1){
			System.out.print(arr[i]+",");
		}else{
			System.out.print(arr[i]);
		}
		
	}
	


	public static void quickSort(int[] arr, int low, int high){
		if(low >= high) return;

		int pivot = arr[low];
		int i = low;
		int j = high;
		int temp;
		while(i < j){
			while(pivot <= arr[j] && i < j){ //這裏i必須小於j,測試案例 4 1 2 3 5 6 7;
				j--;
			}
			while(pivot >= arr[i] && i < j){
				i++;
			}
			if(i < j){
				temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
		arr[low] = arr[i];
		arr[i] = pivot;
		quickSort(arr, low, i-1);
		quickSort(arr, i+1, high);
		
	}

}

 

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