快速排序的思想:找一个基准数,对数组进行排序,使基准数的左边的数都小于等于它,而右边的数都大于等于它,再对左右两部分递归地进行这个过程。
若以第一个数作为基准数,分别从两端开始探测,先从右往左找一个比基数小的数,再从左往右找一个比基数大的数,然后交换,当左右指针相等时,循环结束,此时两个指针所指向的数一定是小于等于基数的(因为先移动右指针,右指针停下要么是找到了比基数小的数,要么就是碰到了左指针,若左指针没有移动过,则指向的是基数,如果移动过,那就是从右指针交换过来的比基数小的数),所以把基数和这个数交换,此时基数左边的数一定都小于等于它,右边的数一定都大于等于它,再分别对基数的左右两部分递归进行快速排序。
public void sort(int[] arr,int low, int high){
if (low >= high){
return;
}
int start = low;
int end = high;
int pivot = arr[start];
while (start < end){
while(start < end && arr[end] > pivot){
end--;
}
while (start < end && arr[start] <= pivot){
start++;
}
if (start == end){
break;
}else{
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
}
arr[low] = arr[start];
arr[start] = pivot;
System.out.println(Arrays.toString(arr));
sort(arr,low,start -1);
sort(arr,start + 1, high);
}