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

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


快速排序

算法思路:

第一步 确定分界点(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();
            }
        }
    }
}
目录
相关文章
|
3月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
13天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
56 8
|
13天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
46 7
|
1月前
|
算法 C# 索引
C#二分查找算法
C#二分查找算法
|
1月前
|
搜索推荐 Shell
解析排序算法:十大排序方法的工作原理与性能比较
解析排序算法:十大排序方法的工作原理与性能比较
52 9
|
1月前
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
24 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
|
1月前
|
存储 算法 C语言
【C语言】二分查找算法
【C语言】二分查找算法
|
1月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
31 0
|
1月前
|
消息中间件 存储 算法
一文搞懂二分查找算法!
一文搞懂二分查找算法!
|
1月前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
20 0
下一篇
无影云桌面