简介
快速排序是对冒泡排序的一种改进,是一种分治算法,时间复杂度为O(nlogn)
基本思想
- 先从数列中取出一个数作为基准数。
- 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
- 再对左右区间重复第二步,直到各区间只有一个数。
Java实现代码
import java.util.Arrays;
public class Main {
public static void main(String[] args){
//测试数据
int[] nums = new int[10];
for(int i=0;i<10;i++)nums[i] = (int)(Math.random()*100);
System.out.println("原数组:");
Arrays.stream(nums).forEach(num->{System.out.print(num+" ");});
quickSort(nums, 0, nums.length-1);
System.out.println("\n排序结果:");
Arrays.stream(nums).forEach(num->{System.out.print(num+" ");});
}
public static void quickSort(int[] nums, int low, int high){
if(low<high){
//以第一个数为基准数,将大于基准数的数放于基准数右侧,小于的则放于左侧
int middle = Qsort(nums, low, high);
//对排序后的左部分排序
quickSort(nums, low, middle-1);
//对排序后的右部分排序
quickSort(nums, middle+1, high);
}
}
public static int Qsort(int[] nums, int low, int high){
/**
* 单次排序
* 步骤:
* 1.从右往左找出第一个比基准数小的数
* 2.从左往右找出第一个比基准数大的数
* 3.重复以上,直到low>high
*/
int middle = nums[low];
while(low<high){
//从右往左找出第一个比基准数小的数
while(low<high&&nums[high]>middle)high--;
nums[low] = nums[high];
//从左往右找出第一个比基准数大的数
while(low<high&&nums[low]<=middle)low++;
nums[high]=nums[low];
}
nums[low] = middle;
//返回基准数的索引
return low;
}
}