分治算法
分治法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。
分治法的精髓
分--将问题分解为规模更小的子问题;
治--将这些规模更小的子问题逐个击破;
合--将已解决的子问题合并,最终得出“母”问题的解。
应用
分治法具体应用有查找技术还有排序技术。查找技术有二分查找;排序有快速排序还有归并排序等。
排序:
快速排序、归并排序。
快速排序:
快速排序应该场景:数据量大并且是线性结构。
短处:有大量重复数据的时候,性能不好单向链式结构处理性能不好(一般来说,链式都不使用)。
步骤:
1.取出数组中最前的数据作为对比数据;定义低位指针和高位指针,分别是数组头部第一个数据和尾部第一个数据。
2.(1)如上图所示,我们需要右移低位指针和左移高位指针取出数据,先取出76>31,高位指针向左移动,低位指针保持不动
(2)当高位指针移动到12位置时,12<31,将会发生交换,取出12与低位指针上的数据进行交换,如下图:
3.(1)当发生数据交换后,低位指针要开始变化,通过低位指针右移一位到68进行对比,68>31,将取出68与高位指针数据进行交换
(2)注意:如果取出的数小于31,将继续右移低位指针,进行数据对比
4.进行完数据交换后,继续左移高位指针,继续将高位指针上的数据进行对比
4.当发现23<31时,继续重复以上步骤2、步骤3,进行数据交换
5.当最后高位指针和低位指针重合时,将31合并到该位置。
6.以上就是快速排序的一次分隔过程。接下来,用代码实现过程。
/**
* 快速排序
* @param array
* @param begin
* @param end
*/
public static void quickSort(int[] array,int begin,int end){
if(end-begin<=0) return;
int x=array[begin];
int low=begin;
int high=end;
boolean direction=true; //标记方向,高低位指针需要左移右移
L1:
while(low<high){
if(direction){ //从右往左找
for(int i=high;i>low;i--){
if(array[i]<=x){
array[low++]=array[i];
high=i;
direction=!direction;
continue L1;
}
}
high=low;//未比较大小,两个指针重合
}else{
for(int i=low;i<high;i++){
if(array[i]>=x){
array[high--]=array[i];
low=i;
direction=!direction;
continue L1;
}
}
low=high;
}
}
array[low]=x; //把最后找到的值,放入中间位置
//以上只是进行一次分隔,所以接下来,我们需要再对左右两端进行分隔操作
quickSort(array,begin,low-1);
quickSort(array,low+1,end);
}