快速排序(Java),前辈帮看看有木有啥问题

来源:互联网 发布:java应聘笔试题 编辑:程序博客网 时间:2024/06/08 03:34
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 


照着《数据结构算法与分析》来的,但是上面的代码都零零碎碎的,这里贴个整的,前辈们看下我这个补漏之后的快排有什么问题吗?