快速排序
//arr:待排数组,left:待排数组最左小标,right:待排数组最右下标
public static void quick(int[] arr,int left,int right){
int mid=(left+right)/2;
int l=left;
int r=right;
int pivot=arr[mid];//以中间的元素为基准,进行比较
//左右指针不能越界
while (l<r){
while (arr[l]<pivot){//找出左边的数比基准数大的,
l++;
}
while (arr[r]>pivot){//找出右边的数比基准数小的,
r--;
}
if (l>=r)break; //如果这个时候已经越界了,那么就直接退出
//否则交换位置
int temp = arr[l];
arr[l]=arr[r];
arr[r]=temp;
//下面的两个if,可以防止数组中有两个相同元素,所导致的死循环
if (arr[l] == pivot){
r--;
}
if (arr[r]==pivot){
l++;
}
}
if (l==r){
r++;
l--;
}
//继续排序,基准数左边部分
if (left<l){
quick(arr,left,l);
}
//继续排序,基准数右边部分
if (right>r){
quick(arr,r,right);
}
}