快速排序、归并排序、二分算法

简介: 快速排序、归并排序、二分算法

快速排序


思路:首先随机定义数组的一个数,把他当成边界值进行排序,一般是取数组中间的一个数,在这个数的左边区间寻找一个比他大的数,在这个数的右边区间寻找一个比他小的数,将这两个数进行交换,最后左边区间的数都小于他,右边的数都大于他,然后在左右区间分别递归。


参数1,待排序数组  参数二,起始索引  参数三,终止索引


private static void quick_sort(int[] q, int l, int r) {
        if(l>=r) return;
        int t=q[(l+r)/2],i=l-1,j=r+1;
            while (i<j){
                do i++; while (q[i]<t);
                do j--; while (q[j]>t);
                if(i<j) {
                    int temp=q[i];
                    q[i]=q[j];
                    q[j]=temp;
                }
            }
        quick_sort(q,l,j);
        quick_sort(q,j+1,r);
    }


归并排序


思路:该算法采用经典的分治策略(把一个大问题分解为若干个小的问题进而求解的过程),将数组不断一分为二,分成n份后,再按照有序数组的拼接方法,两两比较取每一份中的最小值进行拼接,对每个子数组进行拼接,这样就能保证每次的拼接结果都还是有序的最终拼接成一个之后,整个数组便都是有序的


private static void merge_sort(int[] q, int l, int r) {
        if(l>=r) return;
        int mid = l+r>>1;
        merge_sort(q,l,mid);
        merge_sort(q,mid+1,r);
        int k=0,i=l,j=mid+1;
        int []tmp=new int [r-l+1];
        while (i<=mid &&j<=r) {
            if (q[i] < q[j]) tmp[k++] = q[i++];
            else tmp[k++] = q[j++];
        }
            while (i<=mid) tmp[k++]=q[i++];
            while (j<=r) tmp[k++]=q[j++];
            for(int m=l,n=0;m<=r;m++,n++ ) q[m]=tmp[n];
    }


整数二分算法


二分的本质不是单调性, 单调性的题目一定可以二分, 可以二分的题目不一定有单调性

二分的本质是边界

二分法用于查找, 每次都选择答案所在的区间再次进行查找, 当区间长度为 1时, 就是答案


模板1


// 区间[l, r]被划分成 [l, mid] 和 [mid+1, r]时使用
int bsearch_1(int l, int r) {
    while (l < r) {
        int mid = l + r >> 1;
        if (check[mid])  // check() 判断 mid是否满足性质
            r = mid; 
        else
            l = mid + 1;
    }
    return l;
}


模板2


// 区间[l, r]被划分成 [l, mid-1] 和 [mid, r]时使用
int bsearch_2(int l, int r) {
    while (l < r) {
        int mid = l + r + 1 >> 2;   // 注意
        if (check[mid])  // check() 判断 mid是否满足性质
            l = mid;
        else
            r = mid - 1;
    }
    return l;
}


如何选择模板


     根据 check(mid)来判断 r和 l的取值范围

     根据取值范围选择 mid是否有 + 1操作

     如果mid满足条件在左边, r = mid, mid选择 不 +1

    如果mid满足条件在右边, l = mid, mid选择 +1


浮点数二分算法


public static void main(String[] args) {
       Scanner sc=new Scanner(System.in);
       double n= sc.nextDouble();
        double eps=1e-8;
        double l=0,r = 10000;//浮点数范围在10000以内,有负数
        while(r-l>eps){
            double mid=(l+r)/2;
            if(mid*mid*mid>=Math.abs(n)){
                r=mid;
            }else{
                l=mid;
            }
        }
        if (n >= 0)
            System.out.println(String.format("%.6f", l)); // 保留 6位小数
        else
            System.out.println("-" + String.format("%.6f", l));
    }


相关文章
|
3月前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
81 4
|
3月前
|
存储 搜索推荐 Python
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
152 61
|
4月前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
81 1
|
4月前
|
搜索推荐 Java Go
深入了解快速排序算法
深入了解快速排序算法
92 2
|
4月前
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
4月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
98 0
|
4月前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
48 0
|
4月前
|
搜索推荐 Java Go
深入了解归并排序算法
深入了解归并排序算法
61 0
|
2天前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
1月前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。