题目:
给你一个整数数组 nums
,请你将该数组升序排列。
题解:
我们使用快速排序实现,思路:
在数组中任选一个中间值pivot,然后遍历数组使 小于pivot的在左边,大于pivot的在右边,然后递归再对左边和右边进行上述排序,直到只有一个元素时,递归结束。
实现:
1、使用快慢双指针实现
/**
* 使用快慢的双指针实现
* @param arr
* @param low
* @param high
*/
public static void quickSort(int[] arr,int low,int high){
//排序的临界条件 只有一个元素时就可以不排序
if (low >= high){
return;
}
int index = new Random().nextInt(high-low+1)+low;
int tmp = arr[index];
arr[index] = arr[low];
arr[low] = tmp;
int pivot = arr[low]; //任选一个 中间值pivot(第一个元素)
int i = low; //i表示 在i下标之前(包括i)的值都是小于等于 中间值pivot
for (int j = low+1; j <= high; j++) { //从第二个开始遍历
if (arr[j] < pivot){ //遍历到的元素如果小于 中间值pivot 就使 i++ 且下标i和下标j的元素交换
i++;
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
//将选中的 第一个元素中间值pivot 于下标i的元素交换
int t = arr[i];
arr[i] = arr[low];
arr[low] = t;
//继续递归(low,i-1)和(i+1,high)
quickSort(arr,low,i-1);
quickSort(arr,i+1,high);
}
2、使用对撞双指针实现
public int[] sortArray(int[] nums) {
quickSort(nums,0,nums.length-1);
return nums;
}
//使用对撞双指针实现快速排序
public static void quickSort(int[] arr,int low,int high){
//排序的临界条件 只有一个元素时就可以不排序
if (low >= high){
return;
}
int index = new Random().nextInt(high-low+1)+low;
int pivot = arr[index];
//i表示 在i下标之前全是小于pivot
//j表示 在j下标之后全是大于pivot
int i = low,j = high;
while (i <= j){
while (i <= j && arr[i] < pivot){//小于pivot,i++
i++;
}
while (i <= j && arr[j] > pivot){//大于pivot,j--
j--;
}
//此时,i的元素值大于等于pivot,j的元素值小于等于pivot
//所以下标为i和j的元素进行交换
if (i <= j){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
i++;
j--;
}
}
//继续递归pivot的左边和右边元素
quickSort(arr,low,j);
quickSort(arr,i,high);
}