1.概述
快速排序算法是在分治算法基础上设计出来的一种排序算法,和其它排序算法相比,快速排序算法具有效率高、耗费资源少、容易实现等优点。
2.实现思路
快速排序算法的实现思路是:
- 从待排序序列中任选一个元素(假设为 pivot)作为中间元素,将所有比 pivot 小的元素移动到它的左边,所有比 pivot 大的元素移动到它的右边;
- pivot 左右两边的子序列看作是两个待排序序列,各自重复执行第一步。直至所有的子序列都不可再分(仅包含 1 个元素或者不包含任何元素),整个序列就变成了一个有序序列。
真正实现快速排序算法时,我们通常会挑选待排序序列中第一个元素或者最后一个元素作为中间元素。
3.步骤演示
1) 建立 2 个指针(命名为 lo 和 hi),分别指向序列中第一个元素和倒数第 2 个元素,如下图所示:
2) lo 指针向右移动,当指向的元素不小于 31 时暂停。显然,当前指向的 35 > 31,所以 lo 暂时不移动;
3) hi 指针向左移动,当指向的元素不大于 31 时暂停。显然,当前指向的 26< 31,所以 hi 暂时不移动;
4) 交换 lo 和 hi 所指元素的位置,如下图所示:
5) 重复执行 2~4 步,直至 lo ≥ hi。此时,将 pivot 元素与 lo 所指元素交换位置。下面的动画演示了整个分割的过程:
4.代码实现(将第一个元素作为pivot)
/**
* @author wangli
* @data 2022/6/28 16:02
* @Description:
*/
public class QuickSort {
public static void main(String[] args) {
int[] arr={1,4,63,5,7,9,12};
quickSort(arr,0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr, int left, int right) {
//判断传入值是否符合
if(left>=right){
return;
}
//左右指针
int l=left;
int r=right;
//中心轴pivot
int pivot=arr[left];
//临时交换节点
int temp;
//判断两个数是否符合在pivot左边的是比他小在pivot右边比他大
while (l!=r){
//找到比pivot小的值
while (arr[r]>=pivot&&l<r){
r--;
}
while (arr[l]<=pivot&&l<r){
l++;
}
//将不符合的两个数交换位置
temp=arr[l];
arr[l]=arr[r];
arr[r]=temp;
}
//当l和r相等时,将pivot放到中间,正好实现左边小右边大的
arr[left]=arr[l];
arr[l]=pivot;
//向左边递归排序,直至无法排序为止
quickSort(arr,left,l-1);
quickSort(arr,r+1,right);
}
}
5.返回
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/64386.html