快速排序详解--Java实现

先贴代码,下面一行一行的解释
public static void quickSort(int a[],int start,int end)
	{
		if(start<end)
		{
		    int base=a[start];
		    int temp;
		    int i=start;
		    int j=end;
		    do{
		    	while((a[i]<base)&&(i<end))
			{
		            i++;
			}
			while((a[j]>base)&&(j>start))
			{
	           	    j--;
			}
			if(i<=j){
	            	    temp=a[i];
			    a[i]=a[j];
		            a[j]=temp;
			    i++;
			    j--;
			}
								
		    }while(i<=j);
		    if(start<j)
		    {
		        quickSort(a, start, j);
		    }
		    if(end>i)
		    {
			quickSort(a, i, end);
		    }	
		}	
	}

 

public static void quickSort(int a[],int start,int end)

       快速排序需要三个参数,第一个毫无疑问是你要排序的数组了,而第二个和第三个是☞从数组的start位置到end位置
排序,一般是0,a.length-1,代表排序整个数组.

    if(start<end)
为防止所传的2,3参数的值,不符合要求而做的限制


int base=a[start];
int temp;
int i=start;
int j=end;
base:选定的基准值,比base大的放在一边,比base小的放在另一边

temp:用于两数值如:a[i]与a[j]交换的中间值
i:因为start值不应在代码中轻易改变而使用了i作为代替,j也是如此.

while((a[i]<base)&&(i<end))
{
    i++;
}

在一个有序数组中,a[i]即a[start]应都是<base的,但我们传过来的数组a并非一个有序数组,所以就会出现一些a[i]会>base。
而当这种情况出现时,这个while就会因不满足a[i]<base这个条件而停止.我们的i就指向了这个a[i],这即是我们应该进行交换的一个值.     
那另一个值呢?

不是还有一个while么!
while((a[j]>base)&&(j>start))
{
    j--;
}
这个while也如上面一样,如第一次指向的是第10个数,如果它满足条件,则第二次指向第9个数,如果不满足条件就把它揪出来,与上面的那个while揪出来的那个数的值作交换.

那去哪交换数值呢?

当然是下面这行代码啦!
if(i<=j){
    temp=a[i];
    a[i]=a[j];
    a[j]=temp;
    i++;
    j--;
}

交换了数值,并让i++,j++,使下一次的do{}while(i<=j)循环可以继续,从而寻找下一个受害者a[i],a[j](手动滑稽..)

而当我们执行完了这个do{}while(i<=j)后,是不是就完了呢?

然而并没有.
因为我们只是把值<base的分到了一边,值>base的分到了另一边.
但是base这两边的数值还不是完全有序的.
而我们可以把<base的这些数值和>base的这些数值,各看作一个待排序的数组a。
这时我们就想到了递归的思想.
于是就有了下面的这些代码

 if(start<j)
{
    quickSort(a, start, j);
}
if(end>i)
{
    quickSort(a, i, end);
}

通过判断start<j与end>i,确保j与i没有超出start与end的界限
在通过递归,把任务交给下一个quickSort去做.
这样下一个递归就会再选择一个base,把<base的分到一边,>base的分到另一边
然后再递归。。。直到只有1个数值的时候,这时候整个数组就全部调教有序了。

代码来自:https://zhuanlan.zhihu.com/p/27005757

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值