快速排序
快速排序是对冒泡排序的一种改进,由 C.A.R.Hoare(Charles Antony Richard Hoare,东尼·霍尔)在 1962 年提出。
快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使整个数据变成有序序列。
1.算法步骤
1.首先设定一个分界值,通过该分界值将数组分成左右两部分。
2.将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。
3.然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
4.重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
2.动图演示
3.代码实现
/**
* @description:快速排序
* @author: Biobang
* @date: 2022/7/26 20:57
**/
public class QuickSort {
public static void quickSort(int[] arr,int left,int right){
if(left<right) {
int pivot = partition(arr, left, right);
//基准元素左边递归
quickSort(arr, left, pivot - 1);
//基准元素右边递归
quickSort(arr, pivot + 1, right);
}
}
public static int partition(int[] arr,int left,int right){
int pivot = arr[left];//选取第一个元素作为基准元素
while (left<right){
//先从右往左移动,直到遇见小于 pivot 的元素
while (left<right&&arr[right]>=pivot){
right--;
}
arr[left]=arr[right];//记录小于pivot的值
//从左往右遍历,直到遇见大于 pivot 的元素
while (left<right&&arr[left]<=pivot){
left++;
}
arr[right]=arr[left];//记录大于pivot的值
}
arr[left]=pivot;//记录基准元素到当前指针指向的区域
return left;//返回基准元素的索引
}
}