数据结构之排序算法 快速排序 java







import org.junit.Test;
//5快速排序--快排
public class QuickSort {
   @Test
   public void TestPartiton(){
		int a[] = new int[]{25,3,21,0,25,49,25,16,8,23,45,-3,4};
		Partition(a, 0, a.length-1);
		print(a);
   }
   @Test
   public void TestQuicksort(){
	  int a[] = new int[]{15,3,21,0,25,49,25,16,8,23,45,-3,4};
	  Quicksort(a, 0, a.length-1);
	  print(a);
   }
   
   public void Quicksort(int a[],int p,int r){
	   if(p<r){//至少要有两个元素
			//划分结果: 左半区a[p...q-1],  枢轴a[q],  右半区a[q+1...r]
		   int q=Partition(a, p, r);
		   Quicksort(a, p, q-1);
		   Quicksort(a, q+1, r);
	   }
   } 
   
   /*划分: 把a[p...r]范围内的元素进行划分,返回j---实现如下功能:
	 * j为枢轴的位置,a[p...j-1]为左半区,a[j+1...r]为右半区
	 */
   public int Partition(int a[],int p,int r){
	   int i=p;//用于左侧遍历的游标--->找一个大于枢轴的数
	   int j=r+1;//用于右侧遍历的游标--->找一个小于枢轴的数
	   int x=a[p];//把枢轴保存在临时变量x中
	   
	   while(true){
			//在左侧找第一个大于枢轴的数-->i
		   while (a[++i]>x && i<r); //经过这个循环,a[i]就是左区中第一个大于x的元素
		 //在右侧找第一个小于枢轴的数-->j
		   while(a[--j]<x);//经过这个循环,a[j]就是右区中第一个小于x的元素
		   
		   if(i>=j){
				break;
			}
		   
		     //把i与j位置的数进行交换
			swap(a,i,j);
		}	
			//把枢轴(目前p位置的元素)交换到j
			swap(a,p,j);
			
			return j;//枢轴的位置
   }
   
    //优化后的快速排序
   public int Partition2(int a[],int p,int r){
		//相比前面只写了下面两句就实现了快排的优化
		int rand = (int)(Math.random()*(r-p));
	    swap(a,p,p+rand);  //把随机选中的元素换到首元素(枢轴)
		
		
		int i=p;//用于左侧遍历的游标--->找一个大于枢轴的数
		int j=r+1;//用于右侧遍历的游标--->找一个小于枢轴的数
		int x=a[p];//把枢轴保存在临时变量x中
		
		while(true){
			//在左侧找第一个大于枢轴的数-->i
			while(a[++i]<x && i<r); //经过这个循环,a[i]就是左区中第一个大于x的元素
			//在右侧找第一个小于等于枢轴的数-->i
			while(a[--j]>x); //经过这个循环,a[j]就是右区中第一个小于x的元素
			
			if(i>=j){
				break;
			}
			
			//把i与j位置的数进行交换
			swap(a,i,j);
		}
		
		//把枢轴(目前p位置的元素)交换到j
		swap(a,p,j);
		
		return j;//枢轴的位置
   } 
   
   /*
	@Test
	public void quickSort(){
		int a[] = new int[]{1,3,21,0,25,49,25,16,8,23,45,-3,4};
		
		//划分结果: 左半区a[0...q-1],  枢轴a[q],  右半区a[q+1...a.length-1]
		int q = partition(a, 0, a.length-1); 
		
		int qq=partition(a,0,q-1);
		//....
		
		int qqq=partition(a,q+1,a.length-1);
		//.....
	}
	*/
   public void swap(int a[],int i,int j){
	   int temp=a[j];
	   a[j]=a[i];
	   a[i]=temp;
   }
   public void print(int a[]){
	   for(int x:a){
		   System.out.print(x+" ");
	   }
	   System.out.println();
   }
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值