基础算法(一)

目录

一.排序

快速排序:

归并排序:

二.二分法

整数二分模板:

浮点二分:


一.排序

快速排序:

  • 从数列中挑出一个元素,称为 "基准"
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区操作。
  • 递归把小于基准值元素的子数列和大于基准值元素的子数列排序。
java 复制代码
    static void quick_sort(int[] arr,int l,int r){

        if (l>=r) return;//特判小于等于1个的数组

        int x=arr[(l+r)>>1],i=l-1,j=r+1;//取分隔基准

        while (i<j){//把小于x的数放左边,大于x的数放右边

            //跳过已符合条件
            do i++; while (arr[i]<x);
            do j--; while (arr[j]>x);
            //交换使符合条件
            if (i<j){
                int t=arr[i];
                arr[i]=arr[j];
                arr[j]=t;
            }
        }

        //递归左右边排序
        quick_sort(arr,l,j);
        quick_sort(arr,j+1,r);
    }

归并排序:

利用归并(先递归排序子元素,再合并) 的思想实现的排序方法,该算法采用经典的分治 (divide-and-conquer)策略(分治法将问题 (divide)成一些小的问题然后递归求解,而(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

java 复制代码
    static void merge_sort(int[] arr, int l, int r) {
        if (l >= r) return;

        int mid = l + r >> 1;
        merge_sort(arr, l, mid);//递归排序左
        merge_sort(arr, mid + 1, r);//右

        //合并
        int[] tmp = new int[arr.length];

        int k = 0, i = l, j = mid + 1;
        while (i <= mid && j <= r) {//从排序好的左右数组取最小依次放入tmp数组,知道某一个数组取完
            if (arr[i] < arr[j])
                tmp[k++] = arr[i++];
            else
                tmp[k++] = arr[j++];
        }
        //剩余部分直接放入tmp数组末尾
        while (i <= mid) tmp[k++] = arr[i++];
        while (j <= r) tmp[k++] = arr[j++];

        //tmp数组赋给原数组
        for (i = l, j = 0; i <= r; i++, j++) arr[i] = tmp[j];
    }

二.二分法

二分法的思想很简单,因为整个数组是单调的,每次判断后可将另外一半直接排除,大大提高查找效率,但是二分查找的边界问题很容易成为问题

整数二分模板:

java 复制代码
    static int binary_search1(int[] arr,int l, int r){
        while (l<r){
            int mid=l+r>>1;
            if (check(mid)){
                r=mid;
            }else {
                l=mid+1;
            }
        }
        return l;
    }

    static int binary_search2(int[] arr,int l,int r){
        while (l<r){
            int mid=l+r+1>>1;
            if(check(mid)){
                l=mid;
            }else {
                r=mid-1;
            }
        }
        return l;
    }

根据具体情况选择判断后边界的取值,特别注意不同边界下mid的初始化.

浮点二分:

java 复制代码
    static double binary_search3(double[] arr,double l,double r){
        final double eps=1e-6;
        while (r-l>eps){
            double mid=(l+r)/2;
            if (check(mid)) r=mid;
            else l=mid;
        }
        return l;
    }

浮点二分的核心在使用eps的精度进行判断

相关推荐
Aaron15887 小时前
基于VU13P在人工智能高速接口传输上的应用浅析
人工智能·算法·fpga开发·硬件架构·信息与通信·信号处理·基带工程
予枫的编程笔记7 小时前
【论文解读】DLF:以语言为核心的多模态情感分析新范式 (AAAI 2025)
人工智能·python·算法·机器学习
im_AMBER7 小时前
Leetcode 99 删除排序链表中的重复元素 | 合并两个链表
数据结构·笔记·学习·算法·leetcode·链表
王老师青少年编程8 小时前
信奥赛C++提高组csp-s之欧拉回路
c++·算法·csp·欧拉回路·信奥赛·csp-s·提高组
墨有6668 小时前
数学分析栈的出栈顺序:从算法判断到数学本质(卡特兰数初探)
c++·算法·数学建模
zhutoutoutousan8 小时前
氛围数学学习:用游戏化思维征服抽象数学
学习·算法·游戏
guygg888 小时前
基于捷联惯导与多普勒计程仪组合导航的MATLAB算法实现
开发语言·算法·matlab
fengfuyao9858 小时前
遗传算法与粒子群算法求解非线性函数最大值问题
算法
LeetCode天天刷8 小时前
【软件认证】比特翻转【滑动窗口】
算法
源代码•宸8 小时前
Leetcode—1123. 最深叶节点的最近公共祖先【中等】
经验分享·算法·leetcode·职场和发展·golang·dfs