public int[] sortArray(int[] arr) {
quickSort(arr, 0, arr.length-1);
return arr;
}
void quickSort(int[] arr, int l, int r) {
if (l<r) { //符合条件
int i = Partition(arr,l,r); //将数组划分为大小两部分 划分点位置为i
quickSort(arr, l, i-1); //左半部分排序
quickSort(arr, i+1, r); //右半部分排序
}
}
int Partition(int[] arr, int l, int r) {
int temp = arr[l]; //以第一个元素为划分点(基准数)
int i=l, j=r;
while(i<j) {
//从后向前 比基准数大符合要求 继续向前
while(i<j && arr[j]>=temp) j--;
arr[i]=arr[j]; //此时的j比基准数小 交换到前面的位置
//从前向后 比基准数小符合要求 继续向后
while(i<j && arr[i]<=temp) i++;
arr[j]=arr[i];
}
//最后
arr[i] = temp; //此时i=j i即为划分位置 将划分点放在此处
return i; //返回划分点
}
注:arr[i]=arr[j]覆盖了arr[i]怎么办?
第一次,arr[i]=temp 值已保存;之后,arr[i]保存在上一个arr[j]中 值已保存;
对于arr[j]=arr[i],同理 arr[j]保存在上一个arr[i]中 值已保存;