public class QuickSort
{
public static void main(String args[])
{
int[] a={1,3,5,7,9,2,4,6,8,10,11,15,18,0,3,5,7,9,2,4,6,8,10,11,15,18,0,3,5,7,9,2,4,6,8,10,11,15,1};
quickSort(a,0,a.length-1);
for(int i=0;i<a.length;i++)
{
System.out.print(a[i]+" ");
}
}
private static final int CUTOFF = 6;
private static void quickSort(int[] a, int left, int right)
{
if(left+CUTOFF<=right)//right-left>=CUTOFF
{
//找出枢轴点,并将它放在数组最后面的位置
int pivot= median3(a, left, right);
int i = left, j = right - 1;
while (true)
{
//将i, j分别移到大于/小于枢纽值的位置
/*因为数组的第一个和倒数第二个元素分别小于和大于枢纽元,所以不会发生数组越界*/
while (a[++i]<pivot){}
while (a[--j]>pivot){}
//交换
if (i < j)
{
swap(a,i,j);
}
else
break;
}
//将枢纽值与i指向的值交换
swap(a,i,right-1);
//对枢纽值左侧和右侧数组继续进行快速排序
quickSort(a, left, i-1);
quickSort(a, i+1 , right);
}
else{
insertSort(a,left,right);
}
}
public static void insertSort(int[] a,int left,int right)
{
System.out.print("left:"+left+" ");
System.out.println("right:"+right);
for(int i = left+1 ; i <= right ; i ++)
{
int j;
int temp=a[ i ];
for ( j = i ; j >= 1 && a[ j - 1 ] > temp; j-- )
a[ j ] = a[ j - 1 ];
a[ j ] = temp;
}
}
/**
*在数组obj中选取枢纽元,选取方法为取数组第一个、中间一个、最后一个元素中中间的一个。将枢纽元置于倒数第二个位置,三个中最大的放在数组最后一个位置,最小的放在第一个位置
*/
private static int median3(int[] a, int left, int right)
{
int center = (left + right) / 2;
if (a[left]>a[center])
{
swap(a,left,center);
}
if (a[left]>a[right])
{
swap(a,left,right);
}
if (a[center]>a[right])
{
swap(a,center,right);
}
//将枢纽元置于数组的倒数第二个
swap(a,center,right-1);
return a[right-1];
}
public static void swap(int[] a,int i,int j)
{
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
输出:
left:0 right:2
left:4 right:9
left:11 right:14
left:16 right:17
left:19 right:22
left:24 right:26
left:28 right:33
left:35 right:38
0 0 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9 10 10 10 11 11 11 15 15 15 18 18
照着《数据结构算法与分析》来的,但是上面的代码都零零碎碎的,这里贴个整的,前辈们看下我这个补漏之后的快排有什么问题吗?