快速排序
归并排序:
1.将数组分为两个子数组分别排序,并将有序的子数组归并以将整个数组排序;
2.归并排序递归发生在处理数组之前;
3.递归排序数组被等分为两半。
快速排序:
1.当两个子数组都有序时,整个数组就自然有序了;
2.递归发生在处理数组之后;
3.切分(partition)数组取决于数组的内容。
package sort2;
public class Quicksort {
/**
* @author Forever
*
*/
public static void sort(int[] a)
{
sort(a,0,a.length-1);
}
private static void sort(int[] a,int lo,int hi)
{
if(hi<=lo) {
return;
}
int j=partition(a,lo,hi);
sort(a,lo,j-1);
sort(a,j+1,hi);
}
private static int partition(int[] a,int lo, int hi)
{//将数组切分为a[lo..i-1],a[i],a[i+1..hi]
int i=lo,j=hi+1;//左右扫描指针
int v=a[lo]; //切分元素
while(true)
{//扫描左右,检查扫描是否结束并交换元素
while(a[++i]<v){if(i==hi){break;}}
while(v<a[--j]){if(j==lo){break;}}
if(i>=j){break;}
exch(a,i,j);//交换小于v和大于v的数据
}
exch(a,lo,j); //将v=a[j]放入正确的位置
return j;
}
private static void exch(int[] a,int i,int j)
{
int t=a[i];
a[i]=a[j];
a[j]=t;
}
public static void main(String[] args)
{
int[] a= {21,33,4,1,3,4,4,56,6,7,23,34};
sort(a);
for(int i=0;i<a.length;i++)
{
System.out.println(a[i]);
}
}
}
输出:
1
3
4
4
4
6
7
21
23
33
34
56