算法——快速排序
@Author:云都小生
概述——理解快速排序
快速排序算法是一种比冒泡效率更高的算法,既剩时间有省空间。这个算法是由东尼霍尔提出的,后来有很多人进行了优化。
算法是这样的,一开始给定一个数列:{6,2,8,3,5,1,9,4,7,10}
开始的时候,我们选择一个数作为基准数,就选6吧。
接着,我们指定两个哨兵(i,j),它们一个指向这个数列的最左边,一个指向这个数列的最后边。
这个时候,先从右边开始,我们找到比6小的数,找到就停住,然后我们从左边开始找,找到比6大的数,找到就停住。接着我们交换他们的值。
直到这种情况:i==j 我们就直接吧a[i]/a[j]跟基准数交换,这个时候就已经把基数放到真正属于它的位置了。左边的数全部比它小,右边的数全部比它大。
接下来,只要重复上面的步骤,对左边和右边的数列进行排序就行了。
代码实现
import java.util.Arrays;
public class Test
{
public static void main(String[] args) {
int a[] = new int[]{6,2,8,3,5,1,9,4,7,10};
quicksort(a,0,a.length-1);
System.out.println(Arrays.toString(a));
}
public static void quicksort(int[] a,int left,int right)
{
int i,j,t,center;
//递归返回
if(left>right)
{
return;
}
center=a[left]; //center存的是基准数
i=left;
j=right;
while(i!=j)
{
//顺序很重要,要先从右边开始找
while(a[j]>=center && i<j)
{
j--;
}
//再找右边的
while(a[i]<=center && i<j)
{
i++;
}
//交换两个数在数组中的位置(前提是i != j)
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
//最终将基准数归位
a[left]=a[i];
a[i]=center;
quicksort(a,left,i-1);//继续处理左边的,这里是一个递归的过程
quicksort(a,i+1,right);//继续处理右边的 ,这里是一个递归的过程
}
}
2017/10/30 16:34:36 @Author:云都小生