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

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

快速排序


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


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


相关文章
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
775 4
|
算法 搜索推荐
快速排序-数据结构与算法
快速排序(Quick Sort)是一种基于分治法的高效排序算法。其核心思想是通过选择基准(pivot),将数组划分为左右两部分,使得左侧元素均小于基准,右侧元素均大于基准,然后递归地对左右两部分进行排序。时间复杂度平均为 O(n log n),最坏情况下为 O(n²)(如数组已有序)。空间复杂度为 O(1),属于原地排序,但稳定性不佳。 实现步骤包括编写 `partition` 核心逻辑、递归调用的 `quickSort` 和辅助函数 `swap`。优化方法有随机化基准和三数取中法,以减少最坏情况的发生。
754 13
|
存储 搜索推荐 Python
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
438 61
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
615 1
|
搜索推荐
冒泡排序(Bubble Sort)以及选择排序(Selection Sort)和快速排序(Quick Sort)详细解析
冒泡排序(Bubble Sort)以及选择排序(Selection Sort)和快速排序(Quick Sort)详细解析
439 1
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
282 0
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
256 0
|
7月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
700 0
|
7月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
439 2

热门文章

最新文章