java实现快速排序算法

这篇博客介绍了如何使用Java实现快速排序算法,通过观看视频和阅读可视化文章帮助理解。博主建议初学者先从中间元素作为支点开始,逐步理解排序过程。文章提供了详细的步骤和示例代码,并展示了递归实现和测试结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序

看别人写的快排程序,看了很久才看懂。于是搜了很多文章学习一下

先献上两个视频:

一个是匈牙利的舞蹈:https://v.qq.com/x/page/w01315ff3b6.html

一个是c语言实现的快排:https://video.tudou.com/v/XMTc5MjQ3NTkwNA==.html?__fr=oldtd

还推荐一篇可视化的算法:https://www.cnblogs.com/onepixel/articles/7674659.html  (推荐先看这个)

基本的思想估计大家都有了解了,就是:从待排序序列中找到一个关键字(默认为第一个元素) 然后将比关键字少的数据排列在左边,大于关键字的排在右边,然后对关键字左右两边的序列继续上面步骤,直至关键字两边的序列都已经排好序。

我一开始按着有些人将最左边的数作为支点pivot,看得很晕。所以我推荐大家先从将支点设为中间,实现了以后再类比去理解将支点设为最左边的情况。

大致的过程就是首先有左右两个指针,不停的向中间支点移动,如果左指针找到比pivot大的并且右指针找到pivot小的,就将两个指针位置的数交换,交换完继续向pivot移动。我们先把这段代码实现:

 public static void quickSort(int[] numbers,int low,int high)
	    {
	       int i = low;
	       int j = high;
           int povit = numbers[(low+high)/2];

	       while(i<j) {
		       while(numbers[i]<povit) {
		    	   i++;
		       }
		       while(numbers[j]>povit) {
		    	   j--;
		       }
		       if(i<=j) {
		       int temp = numbers[i];
		       numbers[i]=numbers[j];
		       numbers[j]=temp;
		       i++;
		       j--;
		       }
	       }

直到一种情况出现,就是左指针到了右指针的右边,也就是i<j 我们就将左右两边的数组重新进行一趟快排。以此循环往复就是我们所谓的递归:我们在上面的代码加入递归部分

 public static void quickSort(int[] numbers,int low,int high)
	    {
	       int i = low;
	       int j = high;
           int povit = numbers[(low+high)/2];

	       while(i<j) {
		       while(numbers[i]<povit) {
		    	   i++;
		       }
		       while(numbers[j]>povit) {
		    	   j--;
		       }
		       if(i<=j) {
		       int temp = numbers[i];
		       numbers[i]=numbers[j];
		       numbers[j]=temp;
		       i++;
		       j--;
		       }
	       }
	       if(j>low) {
	       quickSort(numbers,low,j);
	       }
	       if(i<high) {
	       quickSort(numbers,i,high);
	       }
	    }

然后主函数设置一个数组测试一下就可以了,你可以按着我的思路自己敲一遍就理解了。

public static void main(String[] args) {
		int[] numbers= {13,12,34,54,67,37,22,1,99};
		quickSort(numbers,0,8);

		for(int a:numbers)
		    System.out.print(a+" ");
	}

结果如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值