快速排序
快速排序
简介
快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
简单来说就是:
1、取一个基准数,进行一次快速排序(执行一次方法),把所有小于它的数放左边,所有大于它的数放右边。
2、左半部分递归(进行第1步),右半部分递归(进行第1步)。
3、直到整个数组都有序。
举个例子:
我们要对 [3,5,1,2,4]
排序。
1、把 [3,5,1,2,4]
这一部分进行快速排序(执行一次方法)。
2、一路下来,得到数组 [2,1,3,5,4]
(3左侧的数都小于3,右侧数都大于等于3)
3、把左侧的 [2,1]
和右侧的 [5,4]
两个部分分别进行快速排序(分别执行一次方法)
4、分别得到 [1,2]
和 [4,5]
5、排序完毕,得到 [1,2,3,4,5]
思路:
写两个方法,一个是getIndex(int[] arr, int left, int right), 一个是quickSort(int[] arr, int left, int right)。
getIndex(int[] arr, int left, int right) :
public static int getIndex(int[] arr,int left,int right) {
//以数组[left,right]范围内的第一个数为基准数,记录下来
int temp=arr[left];//相当于把arr[left]这个数取出来了
while(left<right) {
//从right开始判断,如果大于等于temp就不管它,如果小于temp就(跳出循环)和arr[left]位置交换
while(left<right&&arr[right]>=temp) right--;
//执行每一步前都要判断left是否小于right
if(left<right) {
arr[left]=arr[right];//此时right的位置是空的
left++;
}
//然后从left位置开始判断,如果小于等于temp就不管它,如果大于temp就和right位置交换
while(left<right&&arr[left]<=temp) left++;
if(left<right) {
arr[right]=arr[left];//此时left的位置是空的
right--;
}
}
//此时left=right
arr[left]=temp;
//返回基准数在数组中的位置
return left;
}
quickSort(int[] arr, int left, int right):
public static void quickSort(int[] arr,int left,int right) {
if(left<right) {
int temp=getIndex(arr, left, right);
//左侧区域递归
quickSort(arr, left, temp-1);
//右侧区域递归
quickSort(arr, temp+1, right);
}
}
完整代码
public class Main {
public static int getIndex(int[] arr,int left,int right) {
//以数组[left,right]范围内的第一个数为基准数,记录下来
int temp=arr[left];//相当于把arr[left]这个数取出来了
while(left<right) {
//从right开始判断,如果大于等于temp就不管它,如果小于temp就(跳出循环)和arr[left]位置交换
while(left<right&&arr[right]>=temp) right--;
//执行每一步前都要判断left是否小于right
if(left<right) {
arr[left]=arr[right];//此时right的位置是空的
left++;
}
//然后从left位置开始判断,如果小于等于temp就不管它,如果大于temp就和right位置交换
while(left<right&&arr[left]<=temp) left++;
if(left<right) {
arr[right]=arr[left];//此时left的位置是空的
right--;
}
}
//此时left=right
arr[left]=temp;
//返回基准数在数组中的位置
return left;
}
public static void quickSort(int[] arr,int left,int right) {
if(left<right) {
int temp=getIndex(arr, left, right);
//左侧区域递归
quickSort(arr, left, temp-1);
//右侧区域递归
quickSort(arr, temp+1, right);
}
}
public static void main(String[] args) {
int[] arr= {2,5,3,7,8,4,6,3};
quickSort(arr, 0, arr.length-1);
for(int x:arr) {
System.out.print(x+" ");//2 3 3 4 5 6 7 8
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)