Partition函数的理解以及Java实现 + 快速排序的多种实现

本文参考了《算法导论》及如下博客: 

http://blog.jobbole.com/105219/ 

https://blog.csdn.net/AA2519556/article/details/77884962 

https://www.cnblogs.com/zuilehongdou/p/6197716.html 

http://haoyuanliu.github.io/2016/12/18/Partition%E7%AE%97%E6%B3%95%E5%89%96%E6%9E%90/ 

https://blog.csdn.net/u013457167/article/details/79749882  (思路理解在这篇文章中汇总)

注:上述博客在考虑end是元素的个数n,留意end对应的元素是否被访问,避免漏掉。 

Pa

package Findwork;

/**
 * @author hadoop
 *针对的是版本1中出现的一些问题,现在进行完善;
 *
 */
public class partitionFun_2 {

	public static void main(String[] args) {
		//int arr[]= {5,9,2,1,4,7,5,8,3,6};
		partitionFun_2  p = new partitionFun_2();
		
		int arr[]=p.randomArr(50, 100);
			
		for(int i=0;i<arr.length;i++) 
		{
			System.out.print(arr[i]+ " ");
		}
		
		p.quickSort(arr, 0, arr.length-1);
		System.out.println();
		for(int i=0;i<arr.length;i++) 
		{
			System.out.print(arr[i]+ " ");
		}
	}
	
	public int partition(int arr[],int left ,int right)  //采用指针进行比较
	{
		int pivot = arr[left];			
		int pivotIndex = left;
		
		for(int i=left +1;i<=right;i++) 
		{
			if(arr[i]<=pivot) 
			{
				pivotIndex++;
				swap(arr,pivotIndex,i);
			}
		}
		
		swap(arr, left, pivotIndex);
		return  pivotIndex;
		
	}
	
	public int  partition2(int arr[],int left ,int right) //采用两个指针在寻找
	{
		int pivot =  arr[left];
		int pivotIndex = left;
		
		while(left<right) 
		{
			while(left<right && arr[right]>=pivot)
				right--;
				arr[left] = arr[right];
			while(left<right && arr[left]<pivot)
				left++;
				arr[right] = arr[left];
		}
		 arr[left] = pivot;
		 pivotIndex =left;
		 
		 return pivotIndex;
	}
	
	//分别可以使用上面两种partition函数实现快排,快排递归条件要控制好
	public void quickSort(int arr[],int left ,int right) 
	{
		if (left>=right)//递归终止的条件 
		{
			return;
		}	
		int mid = partition2(arr, left, right);	
		quickSort(arr, left, mid);
		quickSort(arr, mid+1, right);
		
	}
	
//假如不调用partition 函数   直接写出快排
	public void quickSort2(int arr[],int left ,int right) 
	{
		if (left>=right) 
		{
			return ;
		}
		
		int pivot =arr[left];
		int pivotIndex = left;
		
		for (int i =left +1;i<=right;i++) 
		{
			if (arr[i]<=pivot) 
			{
				pivotIndex++;
				swap(arr, pivotIndex, i);
			}
		}
		
		swap(arr, pivotIndex, left);
		
		quickSort2(arr, left, pivotIndex);
		quickSort2(arr, pivotIndex+1, right);
		
		
	}

	public void swap(int arr[],int a ,int b)// 数组中两个元素互换
	{
		int temp = arr[a];
		arr[a] = arr[b];
		arr[b] = temp;
	}
	
	//生成随机数 数组  siz2数组大小 max数以内的值
	public int[] randomArr(int size,int max)
	{
		int arr[] =new int [size];
		
		for (int i=0;i<arr.length;i++) 
		{
			arr[i] = (int)(Math.random()*10000%max); //random函数是随机0到1之间的随机数
		}
		
		return arr;
	}
	

}

rtition函数的枢纽取值有多种取法(取头、取尾等),最好是取元素随机值,时间复杂度低。

猜你喜欢

转载自blog.csdn.net/qq_28619473/article/details/88617275
今日推荐