基础算法模板(一)Java实现

快速排序

public static void quickSort(int arr[],int l,int r) {
    //待排元素为一个或没有时 直接反回
    if (l >= r) return;
    //初始化两端指针 选取中间元素作为比较值
    int i = l - 1,j = r + 1,x = arr[l+r>>1];
    //两端指针相遇时跳出循环
    while(i < j) {
        do i++; while (arr[i] < x);//小于比较值时向前推进
        do j--; while (arr[j] > x);//大于比较值时向前推进
        //两个指针都停下后交换两端元素
        if (i < j) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    //递归排列由比较值分割后的两个部分的元素
    quickSort(arr, l, j);
    quickSort(arr, j+1, r);
    //排序完成
}

归并排序

public static void mergeSort(int [] arr,int l,int r) {
    //待排元素为一个或没有时 直接反回
    if (l >= r) return;
    //确定中点值
    int mid = l+r>>1;
    //递归排列由中点值分割后的两个部分的元素
    mergeSort(arr, l, mid);
    mergeSort(arr, mid+1, r);
    //合并排列好的两个部分的元素
    //i为左边部分第一个元素的起始下标 j为右边部分第一个元素的起始下标
    int i = l,j = mid+1,k = 0; 
    //合并左右两部分的元素当有一遍的元素已经合并完时跳出循环
    while(i<=mid&&j<=r) {
        //左右两边当前指针指向元素进行比较
        //将比较小的优先放入临时存储数组temp 放入后同时指针向后移动一位
        if (arr[i]<=arr[j]) temp[k++] = arr[i++];
        else temp[k++] = arr[j++];
    }
    //将没遍历完的那一边的剩余元素顺序加入到当前temp数组的后面
    while(i<=mid) temp[k++] = arr[i++];
    while(j<=r) temp[k++] = arr[j++];
    //将temp数组中排序好的l-r位置的元素写入到原数组的l-r位置
    for (i = l,j = 0; i <= r; i++,j++) arr[i] = temp[j];
    //排序完成
}

整数二分查找

//二分查找左边界位置
public static int BS_left(int x) {
    //确定查找的起始结束位置
    int l = 0,r = n-1;
	//当起始位置重合时查找结束 跳出循环
    while(l<r) {
        //确定当前查找范围的中点
        int mid = l+r>>1;
        //当目标值x处于起始位置l到中点mid的范围中时
        if (arr[mid]>=x) r = mid;//将查找的结束位置更新为mid
        //当目标值x处于中点mid到结束位置r的范围中时(不包括mid)
        else l = mid + 1;//将查找的起始位置更新为mid+1
    }
	//若查找的边界对应的值不为目标值 表示目标值不存在 返回-1
    if (arr[l]!=x) return -1;
    //目标值存在 返回对应的左边界的位置
    else return l;
}
//二分查找右边界位置
public static int BS_right(int x) {
    //确定查找的起始结束位置
    int l = 0,r = n-1;
	//当起始位置重合时查找结束 跳出循环
    while(l<r) {
        //确定当前查找范围的中点(查找右边界mid值需要加1 防止死循环)
        int mid = l+r+1>>1;
        //当目标值x处于中点mid到结束位置r的范围中时
        if (arr[mid]<=x) l = mid;//将查找的起始位置更新为mid
        //当目标值x处于起始点l到中点mid的范围中时(不包括mid)
        else r = mid - 1;//将查找的结束位置更新为mid-1
    }
	//若查找的边界对应的值不为目标值 表示目标值不存在 返回-1
    if (arr[l]!=x) return -1;
    //目标值存在 返回对应的右边界的位置
    else return l;
}

浮点数二分查找

public static double BS(double n) {
    //确定查找的起始结束位置
    double l = 0,r = n;
    //当起始位置与结束位置缩小到一个小范围时 跳出循环
    while(Math.abs(l-r)>1e-8) {
        //确定当前查找范围的中点
        double mid = (l+r)/2;
        //判断中点相关的条件进行对应边界的缩小
        //浮点数可以直接对起始位置赋值为mid 无需加1或减1
        //因为没有整数运算中取整带来的误差
        if (check(mid)) r = mid;
        else l = mid;
    }
    //缩小到一定范围后取起始位置或结束位置都可以作为最终查找的值
    return l;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值