先贴代码,下面一行一行的解释
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;
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--;
}
{
j--;
}
这个while也如上面一样,如第一次指向的是第10个数,如果它满足条件,则第二次指向第9个数,如果不满足条件就把它揪出来,与上面的那个while揪出来的那个数的值作交换.
那去哪交换数值呢?
当然是下面这行代码啦!
if(i<=j){
temp=a[i];
a[i]=a[j];
a[j]=temp;
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);
}
}
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