以一邊為基數的快速排序法
阿新 • • 發佈:2018-12-29
看寫法二吧,寫法一將方法抽離出來,卻降低了效率。
寫法一(經實測,資料量大時,容易會溢位。)
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); } }