首页 > 编程语言 >基础算法(排序 & 查找)

基础算法(排序 & 查找)

时间:2022-12-20 12:55:05浏览次数:43  
标签:sort int double while mid 算法 查找 排序

快速排序、归并排序、整数二分查找、浮点数二分查找

快速排序

主要思想是分治:

  1. 确定分界点
  2. 调整范围
  3. 递归处理左右两段

代码:

#include <iostream>
using namespace std;

const int N = 1e6+10;

int n,q[N];

void quick_sort(int q[],int l,int r) {
    // 左右重合则返回
    if (l >= r)
        return;
    // 选取分界点和双指针
    int x = q[(l+r+1)/2],i=l-1,j=r+1;
    while (i < j) {
        do i++; while (q[i] < x);
        do j--; while (q[j] > x);
        if (i < j) swap(q[i],q[j]);
    }
    
    // 递归处理左右两段
    quick_sort(q,l,i-1);
    quick_sort(q,i,r);
}

int main() {
    scanf("%d",&n);
    for (int i=0;i<n;i++) {
        scanf("%d",&q[i]);
    }
    quick_sort(q,0,n-1);
    for (int i=0;i<n;i++)
        printf("%d ",q[i]);

    return 0;
}

归并排序

主要思想是分治,快排以一个数来分界,归并以中间来分,并且先递归两边

  1. 确定分界点
  2. 递归排序左右
  3. 归并,合二为一

归并排序是稳定的

#include <bits/stdc++.h>

using namespace std;

const int N = 10e6+10;

int n,q[N],temp[N];

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;
    
    // 归并 将两个有序序列合并为一个有序序列
    while (i <= mid && j <= r) {
        if (q[i] <= q[j]) temp[k++] = q[i++];
        else temp[k++] = q[j++];
    }
    
    // 将未循环完的数直接拼接
    while (i <= mid) temp[k++] = q[i++];
    while (j <= r) temp[k++] = q[j++];
    for (i=l,j=0;i<=r;i++,j++)
        q[i] = temp[j];
}


int main(void) {
    scanf("%d",&n);
    for (int i=0;i<n;i++) {
        scanf("%d",&q[i]);
    }
    merge_sort(q,0,n-1);
    for (int i=0;i<n;i++) {
        printf("%d ",q[i]);
    }   
}

二分查找(整数)

按照某种性质将区间一分为二,分成一半满足和另一半不满足

#include <iostream>
using namespace std;

const int N = 10e5 + 10;

int n,m,q[N];

// 检查x是否具有某种性质
bool check(int x) {
    // .....
} 

// 第一种: 区间[l,r]划分为[l,mid]和[mid+1,r]
int bsearch(int l,int r) {
    while (l < r) {
        int mid = l + r >> 1;
        if (check(mid)) r = mid;
        else l = mid + 1;
    }
    return l;
}

// 第二种: 区间[l,r]划分为[l,mid-1]和[mid,r]
int bsearch(int l,int r) {
    while (l < r) {
        int mid = l + r + 1 >> 1;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    return l;
}

二分查找(浮点)

浮点数的二分查找要关注精度

bool check(double x) {
    // .....
} 

double bsearch(double l,double r) {
    const double eps = 1e-6;
    while (r - l > eps) {
        double mid = (l + r) / 2;
        if (check(mid)) r = mid;
        else l = mid;
    }
    return l;
}

标签:sort,int,double,while,mid,算法,查找,排序
From: https://www.cnblogs.com/N3ptune/p/16993955.html

相关文章

  • Python面试常见算法题集锦(递归部分)
    0x1前言开始学习python基础的时候,有以下几种算法是面试中常见的,也是前期学习python的时候可以连带学习了解的,不卡门槛哟0x2实现算法的方式很多种,而算法的实现也是分程......
  • 二分法搜索算法
    今天看书时,书上提到二分法虽然道理简单,大家一听就明白但是真正能一次性写出别出错的实现还是比较难的,即使给了你充足的时间,比如1小时。如果你不是特别认真的话,可能还是会出......
  • 基于MATLAB的pso粒子群算法优化——计算样本再拟合函数最大值
    1.算法概述       PSO是粒子群优化算法(——ParticleSwarmOptimization)的英文缩写,是一种基于种群的随机优化技术,由Eberhart和Kennedy于1995年提出。粒子群算法模......
  • 深入理解【缺页中断】及FIFO、LRU、OPT这三种置换算法
    缺页中断(英语:Pagefault,又名硬错误、硬中断、分页错误、寻页缺失、缺页中断、页故障等)指的是当软件试图访问已映射在​​虚拟​​​​地址空间​​​中,但是目前并未被加载在......
  • linux 中如何查找在过去一段时间内修改过的文件
     001、查找在过去五分钟内修改过的文件find./-mmin-5 002、查找在过去10分钟内修改过的文件find./-mmin-10 003、查找在过去一天内修改过的文件......
  • Java实现7种常见密码算法
    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介前面在密码学入门一文中讲解了各种常见的密码学概念、算法与运用场景,但没有介绍过代码,因此,为作补充,这......
  • 一致性hash算法 - consistent hashing
    consistenthashing ​​算法​​早在 1997 年就在论文 ​​Consistenthashingandrandomtrees​​ 中被提出,目前在cache 系统中应用越来越广泛;1比如你有 N 个 ......
  • MySQL索引背后的数据结构及算法原理
    摘要:看到的一篇关于MySql索引的介绍,感觉比较经典,直接转了。 摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸......
  • [机器学习] sklearn朴素贝叶斯算法
    date:2018-04-1900:35:22+0800tags:-机器学习-Python朴素贝叶斯算法是来利用统计学中的条件概率来进行分类的一种算法。贝叶斯定理和......
  • 协同过滤算法:在线推荐系统如何工作?
    摘要:个性化推荐系统为电子商务网站提供了一个强大的营销工具,而协同过滤技术被认为是最有前途的个性化推荐技术之一。文中主要介绍了亚马逊的协同过滤推荐系统,并且对比了Fac......