1. 程式人生 > >java中快速排序的優化

java中快速排序的優化

接上節講的快速排序,我們來了解一下幾種它的優化。

1.隨機取基準

    上節我們採取的是以開頭為基準,然後進行一次快速排序,但是如果原陣列相對有

序的話,那麼就會出現每次找基準,原陣列順序不變,時間複雜度相當的高,為了處

理這種情況我們採用隨機選取基準,就是

 public static void new_Quick(int[] array,int low,int high){  
        swap(array,low,rand.nextInt(high-low+1)+low);  //因為不知道起始位置,所以後面加上low
        int par = partion(array,low,high);  
        if(par > low+1){  
            Quick(array,low,par);  
        }  
        if(par < high-1){  
            Quick(array,par+1,high);  
        }  
    }   
    public static void swap(int[] array,int start,int end){  
        int tmp = array[start];  
        array[start] = array[end];  
        array[end] = tmp;  
    }  

2.當前陣列中的值過少可以採取直接快速排序法

    這種方法我們就不多做介紹了,我們可以自己確定一個數,比如十,少於十的時

候,直接呼叫快速排序的方法。

3.聚集相同元素法

    經常會出現一個數組中有很多個相同的元素,為了方便和加速遞迴,相同的元素我

們可以不用再次遞迴,直接放在基準的左右位置。

 

以如圖為例,我們發現第一次的基準12,有很多相同的元素,那我們遍歷的時候可以

將12放在他的周圍,然後從除12的數字遍歷


然後就是程式碼實現:

public static int [] fun(int []array,int right,int left,int start,int end,int par){
		int parRight = par-1;
		int parleft = par+1;
		int tmp = 0;
		for(int i = parleft;i>=start;i--){
			if(array[par] == array[i]){
				if(i != parleft){
					tmp = array[parleft];
					array[parleft] = array[i];
					array[i] = tmp;
					parleft--;
				}
			}else{
				parleft--;
			}
		}
		left = parleft;
		for(int j = parRight;j<=end;j++){
			if(array[par] == array[j]){
				if(j != parleft){
					tmp = array[parRight];
					array[parRight] = array[j];
					array[j] = tmp;
					parRight++;
				}
			}else{
				parRight++;
			}
		}
		right = parRight;
		int a[] = {left,right};
		return a;
	}

如有錯誤,請多多指教。