前几天写了二分查找,今天重新来看快速排序。发现他们有许多共同的地方。
先说说二分的思想:对于有序数组,
- 将数组为两份取中间值,如果等于返回。
- 如果小于继续在左区间寻找,重复步骤1.
- 如果大于在右区间找,重复步骤1.
执行上述步骤,直到left指向的下标大于right指向的下标(说明遍历完了了还没有找到)。
在来说说快速排序:
- 选择一个基准值将比他小的值移到左边,比他大的值移到右边。
- 左边区域右边区域重复步骤4,直到每个分区只有一个数。
可以说快速排序是一种分治的思想,然后我们如果只看分区过后的话,可以发现它和二分有些神似,特别是在编写代码的过程中我们可以发现他们的相似之处。
二分的代码:
public boolean binarySerach(int[] args,int left,int right,int target) {
int mid = (left+right)/2;
if(left>right) {
//说明没有数据符合条件
return false;
}
if(args[mid] == target) {
return true;
} else if(target > args[mid]) {
//右️区间搜索
return binarySerach(args,mid+1,right,target);
} else if(target < args[mid]) {
//左区间搜索
return binarySerach(args,left,mid-1,target);
}
return false;
}
快速排序
public int[] sort(int arr[],int left,int right) {
if(left<right) {
int pattation = pattation(arr,left,right);
sort(arr,left,pattation-1);
sort(arr,pattation+1,right);
}
return arr;
}
public int pattation(int arr[],int left, int right) {
//以左边为基准
int pivot = left;
int index = pivot+1;
//小于基准的全部放到左边
for (int i = index; i <= right; i++) {
if(arr[i]< arr [pivot]) {
swap(arr,i,index);
index++;
}
}
swap(arr,pivot,index-1);
return index-1;
}
//交换元素
public void swap(int arr[],int i,int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
可以看出两份代码都是左右进行分区操作,区别就是快速排序多了一个分区操作,获得一个中点。