基本算法(排序和二分查找)

勤奋不是嘴上说说而已,而是实际的行动,在勤奋的苦度中持之以恒,永不退却。业精于勤,荒于嬉;行成于思,毁于随。在人生的仕途上,我们毫不迟疑地选择勤奋,她是几乎于世界上一切成就的催产婆。只要我们拥着勤奋去思考,拥着勤奋的手去耕耘,用抱勤奋的心去对待工作,浪迹红尘而坚韧不拔,那么,我们的生命就会绽放火花,让人生的时光更加的闪亮而精彩。

导读:本篇文章讲解 基本算法(排序和二分查找),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文


快速排序

算法思路:

第一步 确定分界点(q[l],q[(l+r)/2],q[r]随机)

第二步 小于等于x(第一个区间)
大于等于x(第二个区间)

第三步 递归处理左右两段

图解:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码示例:

public class 快速排序 {
    public static void paixu(int[] p,int l,int r){
        if(l>=r){
            return;
        }
        int x = p[l];
        int m=l-1;
        int n=r+1;
        int temp;
        while(m<n){
            do m++; while (p[m]<x);
            do n--; while (p[n]>x);
            if(m<n){
                temp = p[m];
                p[m]=p[n];
                p[n]=temp;
            }
        }
        paixu(p,l,n);
        paixu(p,n+1,r);
    }
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int[] str = new int[N];
        for(int i=0;i<N;i++){
            str[i]=sc.nextInt();
        }
        paixu(str,0,N-1);
        System.out.println(Arrays.toString(str));
    }
}

归并排序

算法思路:

第一步 确定分界点:mid=(1+r)/2

第二步 递归排序:left=right

第三步 归并合二为一

图解:
在这里插入图片描述

代码示例:

public class 归并排序 {
    public static void panduan(int[] tmp,int[] q,int l,int r){
        if(l>=r){
            return;
        }
        int mid = (l+r)/2;
        panduan(tmp,q,l,mid);
        panduan(tmp,q,mid+1,r);
        int k=0,i=l,j=mid+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(i=l,j=0;i<=r;i++,j++) q[i]=tmp[j];
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int[] str = new int[N];
        int[] tmp = new int[N];
        for(int i=0;i<N;i++){
            str[i]=sc.nextInt();
        }
        panduan(tmp,str,0,N-1);
        System.out.println(Arrays.toString(str));
    }
}

二分查找

算法思路:

在这里插入图片描述
例题:给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。如果数组中不存在该元素,则返回“-1 -1”。

示例代码:

public class 数的范围 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int M = sc.nextInt();
        int[] str = new int[N];
        for(int i=0;i<N;i++){
            str[i] = sc.nextInt();
        }

        for(int i=0;i<M;i++){
            int x = sc.nextInt();
            int l=0,r=N-1;
            while (l<r){
                int mid = (l+r)/2;
                if(str[mid]>=x) r=mid;
                else l=mid+1;
            }
            if(str[l]!=x) System.out.println("-1 -1");
            else{
                System.out.print(l+" ");
                l=0;
                r=N-1;
                while (l<r){
                 int mid = (l+r+1)/2;
                 if(str[mid]<=x) l=mid;
                 else  r=mid-1;
                }
                System.out.print(l);
                System.out.println();
            }
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/141570.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!