1. 程式人生 > >以一邊為基數的快速排序法

以一邊為基數的快速排序法

看寫法二吧,寫法一將方法抽離出來,卻降低了效率。
寫法一(經實測,資料量大時,容易會溢位。)

	private void quickSort3(int[] arr, int left, int right) {
		if(left<right){
			int middle = getMiddle(arr,left,right);//實際的排序流程
			//利用分治法的思想對陣列進行遞迴。
			quickSort3(arr, left, middle-1);
			quickSort3(arr, middle+1, right);
		}
	}

	private int getMiddle(int[] arr, int left, int right) {
		int base = arr[left];//以左側為基數
		int index = left;//基數下標
		while(left<right){
			while(left<right&&arr[right]>=base){
				right--;
			}
			arr[index] = arr[right];//將基數所在下標對應的值改為找到的比基數小的值
			arr[right] = base;//將找到的比基數小的位置的值改為基數
			index = right;//修改基數下標
			while(left<right&&arr[left]<=base){
				left++;
			}
			arr[index] = arr[left];
			arr[left] = base;
			index = left;
		}
		return index;
	}

寫法二

	private void quickSort3(int[] arr, int left, int right) {
		if(left<right){
			int base = arr[left];
			int middle = left;//記錄基數的下標
			while(left<right){
				while(left<right&&arr[right]>=base){
					right--;
				}
				arr[middle] = arr[right];//將基數所在下標對應的值改為找到的比基數小的值
				middle = right;//修改基數所在的下標位置
				arr[right] = base;//將找到的比基數小的位置的值改為基數的值
				while(left<right&&arr[left]<=base){
					left++;
				}
				arr[middle] = arr[left];
				middle = left;
				arr[left] = base;
			}
			//運用分治法的思想對陣列進行遞迴。
			quickSort3(arr, left, middle-1);
			quickSort3(arr, middle+1, right);
		}
	}