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

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

快速排序


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


参数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));
    }


相关文章
|
20天前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
14 1
|
27天前
|
搜索推荐 Java Go
深入了解快速排序算法
深入了解快速排序算法
24 2
|
24天前
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
26天前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
65 0
|
26天前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
20 0
|
27天前
|
搜索推荐 Java Go
深入了解归并排序算法
深入了解归并排序算法
15 0
|
28天前
|
搜索推荐 C语言 C++
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
|
3月前
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
35 0
|
7天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
4天前
|
人工智能 算法 数据安全/隐私保护
基于遗传优化的SVD水印嵌入提取算法matlab仿真
该算法基于遗传优化的SVD水印嵌入与提取技术,通过遗传算法优化水印嵌入参数,提高水印的鲁棒性和隐蔽性。在MATLAB2022a环境下测试,展示了优化前后的性能对比及不同干扰下的水印提取效果。核心程序实现了SVD分解、遗传算法流程及其参数优化,有效提升了水印技术的应用价值。