分治法:快排划分法(单向扫描法)

一、分治法
将一个规模较大的问题转化为多个相同形式小规模的子问题,子问题规模较小时,可自然求解。
子问题的解可通过合并得到原问题的解。
举例:小明让小张和小李去借2000元,小张借1000,小李借1000,他们各自向朋友去借,这就是一个分治问题
在这里插入图片描述二、一遍单向扫描法:
思路:用两个指针将数组划分为三个区间。
扫描指针左边是确认小于等于主元的。
扫描指针右边是确认大于主元的
在这里插入图片描述
一遍单向扫描法:选定第一个数组元素为主元,以它为基准,左指针开始从左边挨个扫描,若扫描到的元素比主元小或相等,则保持位置不变,若扫描到的元素比主元大,此时这个元素与右指针所指元素交换
在这里插入图片描述
在这里插入图片描述
交换之后右指针向左移动
在这里插入图片描述
右指针若遇到比主元大的元素,该元素保持原位置不动,右指针继续左移,若扫描到的元素比主元小,则和左指针所指位置元素交换。
重复以上步骤,直到左右指针相遇。
伪代码

伪代码
QuickSort
 quickSort(A,p,r) 
 if(p<r)
 q=partition(A,p,r)
 quickSort(A,p,q-1)
 quickSort(A,q+1,r) 
 
 partition(A,p,r)
 pivot=A[p];
 sp=p+1;  //sp为扫描指针;左指针p向右移动 
 bigger=r  //最右边元素 
 while(sp<=bigger);
 if(A[sp]<=pivot)  //扫描指针小于主元 
  sp++   //指针右移 
  else
  swap(A,sp,bigger)  //否则交换指针所指元素 
  bigger--
  
  swap(A,p,bigger)
  return bigger

代码

public class Util {
	public static void main(String[] args) {
	int [] arr=Util.getRandomArr(10,1,20);  //数组长度为10,1-20之间随机选取10个数 
    Util.print(arr);
	int length;
	quickSort(arr,0,length-1);
	Util.print(arr);
}
	 private static void print(int[] arr) {
		// TODO Auto-generated method stub
		
	}
	private static int[] getRandomArr(int i, int j, int k) {
		// TODO Auto-generated method stub
		return null;
	}
	public static  int quickSort(int A[],int p,int r){
		 	//定义数组A,p为初始左指针,r为初始右指针 
		  if(p<r){  // 
		 
		  int q=partition(A,p,r);  //分隔数组的左指针与右指针 ,左边元素大于右边元素 
		  quickSort(A,p,q-1);   //左边元素大于右边元素 
		  quickSort(A,q+1,r);
		}
		}
		 public static int partition(int A[],int p,int r){
		 
		  int pivot=A[p];   //确定主元为第一个p所指的元素 
		 int sp=p+1;  //sp为扫描指针;左指针p向右移动 
		 int bigger=r;  //右指针;r为数组最右端的指针 
		 while(sp<=bigger) //左指针扫描的元素大于有指针元素,一直继续扫描 
		 if(A[sp]<=pivot)   //如果左指针所指元素小于主元 
		  sp++;  //继续扫描    
		  else   //否则 
		  Util.swap(A,sp,bigger);   //将左指针所指元素与右指针所指元素交换 
		  bigger--;    //右指针左移 
		  
		  swap(A,p,bigger);  //如果交换之后左指针所指元素还是大于主元 
		  return bigger;
		 }

发布了107 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/gl620321/article/details/104401530