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

原创 2013年12月05日 09:55:27
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 


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

快速排序法 java实现 三种方法实现

快速排序法 (1)定义 快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。 (...
  • u013276277
  • u013276277
  • 2017年05月18日 14:27
  • 752

Java 实现 堆排序 快速排序 以及 TopK问题(二)

接上文 已知快速排序可以将一个数组分成两部分,一部分大于某个值,一部分小于某个值,那么由这点可以推出取TopK值的方法如下: 假设快排每一趟的分割值的点为p,数组长度为n,那么需要...
  • b7771253
  • b7771253
  • 2016年09月13日 13:42
  • 358

面试题一:使用 java 实现快速排序

快排:快排一般是以某个对象作为基础,这边以数字为例,比如有10个数字,我一般选择以第一个数字为基准 到后面查找,大于这个数字的,放到基准数右边,小于这个数字的,放到基准数左边。然后不断得执行下去,直...
  • hhooong
  • hhooong
  • 2016年04月05日 16:26
  • 634

排序问题之快速排序

排序算法有很多,最常见的是冒泡排序,但冒泡排序只是简单的将相邻位置的两个元素比较并交换位置,所以时间复杂度是O(N2)。快速排序的基本思想是先设一个基准数X(为了方便可以选取数组最左端的数字),比基准...
  • shiluoye_lean
  • shiluoye_lean
  • 2017年03月29日 15:23
  • 181

【排序算法】快速排序原理及Java实现

快速排序是我们之前学习的冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的。快速排序是一种非常高效的排序算法,它的实现,增大了记录的比较和移动的距离,将关键字较大的记录从前面直...
  • jianyuerensheng
  • jianyuerensheng
  • 2016年04月27日 09:08
  • 25145

图文讲解QuickSort快速排序算法(Java版)

什么是快速排序? 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此...
  • IT_ZJYANG
  • IT_ZJYANG
  • 2016年11月30日 14:28
  • 2904

算法 -- Java实现快速排序(图解 + 代码实现)

算法 -- Java实现快速排序(图解 + 代码实现)...
  • feng2qing
  • feng2qing
  • 2016年12月25日 10:58
  • 812

快速排序算法Java详解

快速排序是一种分治排序的算法,将数组划分为两个部分,然后分别对两个部分进行排序。在实际应用中,一个经过仔细调整的快速排序算法应该在大多数计算机上运行的比其他排序算法要快的多,对于大型文件,快速排序的性...
  • ghuiL
  • ghuiL
  • 2014年11月08日 16:17
  • 11405

JAVA简单快速排序讲解

首先,我们来了解一下什么是快速排序: 所谓快速排序,就是在冒泡排序的基础上进行改进,延伸出来的一种跳跃性的排序方法,我们都知道,冒泡排序,就是相邻两个数之间进行比较,然后根据情况(从小到大,从大到小...
  • IT_smallBird007
  • IT_smallBird007
  • 2017年05月29日 14:22
  • 1171

[排序算法]--快速排序的Java实现

快速排序 所谓快速排序:基于分治的思想,是冒泡排序的改进型。首先在数组中选择一个基准点(该基准点的选取可能影响快速排序的效率,关于基准点的选择方法后面再讲解),然后分别从数组的两端扫描数组,设两个...
  • u010853261
  • u010853261
  • 2017年02月05日 23:58
  • 961
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:快速排序(Java),前辈帮看看有木有啥问题
举报原因:
原因补充:

(最多只允许输入30个字)