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

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


快速排序

算法思路:

第一步 确定分界点(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();
            }
        }
    }
}
目录
相关文章
|
2天前
|
人工智能 算法 测试技术
【数学】【排序】【C++算法】3027人员站位的方案数
【数学】【排序】【C++算法】3027人员站位的方案数
|
2天前
|
人工智能 算法 BI
【优选算法专栏】专题十八:BFS解决拓扑排序(一)
【优选算法专栏】专题十八:BFS解决拓扑排序(一)
20 0
|
2天前
|
算法
【优选算法专栏】专题十八:BFS解决拓扑排序--前言
【优选算法专栏】专题十八:BFS解决拓扑排序--前言
22 1
|
2天前
|
算法
常见的算法排序(2)
常见的算法排序(2)
12 3
|
2天前
|
算法 搜索推荐 索引
数据结构与算法 排序(下)
数据结构与算法 排序(下)
12 1
|
2天前
|
缓存 算法 搜索推荐
数据结构与算法 排序(上)
数据结构与算法 排序(上)
11 0
|
2天前
|
算法 调度
【问题探讨】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究
【问题探讨】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究
|
2天前
|
搜索推荐 C语言
【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)
【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)
11 0
|
2天前
|
算法
讲课:拓扑排序、最短路算法
讲课:拓扑排序、最短路算法
|
2天前
|
算法 测试技术 C#
【模拟】【C++算法】2826. 将三个组排序
【模拟】【C++算法】2826. 将三个组排序