菜鸟日记—1月31日
案例一
二分查找递归解法
全范围内二分查找
等价于三个子问题:
- 左边找(递归)
- 中间比
- 右边找(递归)
注意:左查找和右查找只选其一
/*
* arr : 顺序数字数组
* start : 开始指针
* end : 结束指针
* key : 要找的值
* index : 中位数指针
* indexkey : 中位数
*/
public class 二分查找递归解法 {
public static void main(String[] args) {
int[] arr = {10,20,30,40,50,60,70,80,90,100};
System.out.println(erfen(arr,0, arr.length - 1, 60));
}
static int erfen(int[] arr ,int start,int end,int key){
if (start > end){
//边界,找不到值返回-1
return -1;
}
//求中位数
int index = start + ((end - start) / 2);
//中位数指针所对应的值
int indexkey = arr[index];
//求的值在右边时
if (indexkey < key){
return erfen(arr,index + 1,end,key);
}
//求的值在左边时
else if (indexkey > key){
return erfen(arr,start,index - 1,key);
}
//相等直接返回
else
return index;
}
}
案例二
希尔排序
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;
希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
import java.util.Arrays;
/*
* interval : 增量
* N : 数组长度
* key : 后一个数
* arr[j] : 前一个数
* */
public class 希尔排序 {
public static void main(String[] args) {
int[] arr = {9,8,7,5,69,2,58};
System.out.println(Arrays.toString(xier(arr)));
}
static int[] xier(int[] arr){
int N = arr.length;
//不断缩小增量
for (int interval = N/2;interval > 0;interval = interval / 2){
for (int i = interval;i < N; i++){
int key = arr[i];
int j = i - interval;
//若后一个数小于前一个数,则向右移位
while (j > -1 && key < arr[j]){
arr[j + interval] = arr[j];
j -= interval;
}
//交换
arr[j + interval] = key;
}
}
return arr;
}
}