快速排序完美优化版【JAVA】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/majichen95/article/details/82261785

相比较原始快排,这里优化了两个地方:

优化1:为防止在近乎有序的数组,partition分割极度不平衡,可将v元素随机化选取

优化2:递归到一定程度可使用插入排序

另外为了方便大家理解partition过程,附图一张:

    public void quickSort(int[] nums){
    	if(nums == null || nums.length <=0)
    		return;
    	
    	quickSort(nums , 0 , nums.length-1);
    }
    
    public void quickSort(int[] nums , int l , int r){  //对nums[l...r]部分进行快排
    	//if(l >= r) //原始递归到底方法
    		//return;
    	if(r-l <= 15){	//优化2:递归到一定程度可使用插入排序
    		insertSort(nums , l , r);
    		return;
    	}
    	
    	int p = partition(nums , l , r);

    	quickSort(nums , l , p-1);
    	quickSort(nums , p+1 , r);
    }
    
    public int partition(int[] nums , int l , int r){
    	swap(nums , l , l+(int)(Math.random()*(r+1-l)));//优化1:为防止在近乎有序的数组,partition分割极度不平衡,可将v元素随机化选取
    	
    	int v = nums[l];
    	int j = l;
    	
    	for(int i = j+1 ; i<=r ; i++)
    		if(nums[i]<v)
    			swap(nums , ++j , i);
    	
    	swap(nums , l , j);
    	
    	return j;
    }
    
    public void insertSort(int[] nums , int l , int r){
    	for(int i=l+1 ; i<=r ; i++){
    		int temp = nums[i];
    		int j=i;
    		
    		for(; j>l && nums[j-1]>temp ; j--){
    			nums[j] = nums[j-1];
    		}
    		nums[j] = temp;
    	}
    }
    
    public void swap(int[] nums , int i , int j){
    	int temp = nums[i];
    	nums[i] = nums[j];
    	nums[j] = temp;
    }

猜你喜欢

转载自blog.csdn.net/majichen95/article/details/82261785