快速排序(三數中值法)
阿新 • • 發佈:2018-11-15
package sort; public class QuickSort {//快速排序 public static void main(String[] args) { int[] array = {39,44,1,0,8,66,23,67,9,15,100,70,22,3,6,54}; QuickSort qs=new QuickSort(); qs.quickSort(array,0, array.length-1); for(int i:array) { System.out.println(i); } } public void swap(int a[],int i,int j) { int temp=a[i]; a[i]=a[j]; a[j]=temp; } public int median3(int []a,int left,int right)//三數中值分割法 { if(right-left+1>=3){ int center=(left+right)/2; if(a[center]<a[left]) swap(a,left,center); if(a[center]>a[right]) swap(a,center,right); if(a[center]<a[left]) swap(a,left,center); swap(a,right-1,center);//選定中值並排序,將中值置於倒數第一位便於排序時插入 return a[right-1]; } else//針對於少於三個數的處理情況 if(a[left]>a[right]) swap(a,left,right); return 0; } public void quickSort(int []a,int left,int right) { int pivot=median3(a,left,right); if(right-left+1>3)//對於長度小於三的情況median函式足以處理 { int i=left; int j=right-1; while(true){ while(a[++i]<pivot){}//從第二位向後詢值 while(a[--j]>pivot){}//從中值之前,即倒數第二位向前詢值 if(i<j) swap(a,i,j); else break; } swap(a,i,right-1);//當i>j時將其中一個大於中值的值與中值交換位置 quickSort(a, left, i-1); quickSort(a, i+1, right); } } }