快速排序

快速排序

简介

快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

简单来说就是:
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
		}
	}
}

参考文章:

快速排序

posted @   QING~h  阅读(71)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示

目录导航