算法基础第一天打卡-快排-归并-逆序数-整数二分-浮点数二分

排序算法
本文提供了快速排序、归并排序的实现代码,并介绍了如何通过归并排序计算逆序对数量的方法。此外,还展示了二分查找的不同应用场景及其对应的代码实现。

快排:

#include <bits/stdc++.h>
using namespace std;

int nums[100005];

void my_sort(int l,int r){
    if(l>=r) return ;
    int ran = rand()%(r-l+1)+l;
    swap(nums[ran],nums[r]);

    int x = nums[r],i = l-1,j = r+1;
    while(i<j)
    {
        do i++; while(nums[i]<x);
        do j--;while(nums[j]>x);
        if(i<j) swap(nums[i],nums[j]);
    }

    my_sort(l,i-1);//这里如果是 i下面是i+1会有边界问题 要修改上面的x为nums[l]
    my_sort(i,r);
}

int main() {
    int len;
    scanf("%d",&len);
    for(int i = 0;i<len;i++){
        scanf("%d",&nums[i]);
    }//下标从1开始

    my_sort(0,len-1);

    for(int i = 0;i<len;i++){
        printf("%d ",nums[i]);
    }


    return 0;
}

归并:

#include <bits/stdc++.h>
using namespace std;

const int N = 1000005;
int n;
int nums[N],temp[N];

void merge_sort(int l,int r){
    if(l>=r) return ;

    int mid = l+r>>1;

    merge_sort(l,mid);
    merge_sort(mid+1,r);

    int i = l,j=mid+1;
    int k =0;
    while(i<=mid&&j<=r){
        if(nums[i]<=nums[j]) temp[k++] = nums[i++];
        else temp[k++] = nums[j++];
    }
    while(i<=mid) temp[k++] = nums[i++];
    while(j<=r) temp[k++] = nums[j++];
    for(int x = 0,y =l;y<=r;y++,x++){
        nums[y] = temp[x];
    }
}


int main() {
    scanf("%d",&n);
    for(int i = 0;i<n;i++){
        scanf("%d",&nums[i]);
    }

    merge_sort(0,n-1);

    for(int i =0 ;i<n;i++){
        printf("%d ",nums[i]);
    }

    return 0;
}

逆序对的数量:

#include <iostream>
using namespace std;
typedef long long ll;
ll n;
const int N = 1000010;
int nums[N],tmp[N];
ll m_sort(int nums[],int l,int r){
    if(l>=r) return 0;
    int mid = (l+r)>>1;
    ll res = m_sort(nums,l,mid)+ m_sort(nums,mid+1,r);
    int i = l,j = mid+1,k = 0;
    while(i<=mid&&j<=r){
        if(nums[i]>nums[j]){
            tmp[k++] = nums[j++];
            res += (mid - i + 1);
        }else{
            tmp[k++] = nums[i++];
        }
    }
    while(i<=mid) tmp[k++] = nums[i++];
    while(j<=r) tmp[k++] = nums[j++];

    for(int x=0,y=l;y<=r;x++,y++){
        nums[y] = tmp[x];
    }

    return res;
}

int main() {
    cin>>n;
    for(int i = 0;i<n;i++){
        cin>>nums[i];
    }
    ll ans = m_sort(nums,0,n-1);
    cout<<ans;
    return 0;
}

二分模板:

#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

bool check(int mid){
    return true;
}

//模板一 答案尽可能大
int half_1(int l,int r) {
    while (l < r) {
        int mid = (l + r + 1) >> 1;
        if (check(mid)) {
            l = mid;
        } else {
            r = mid - 1;
        }
    }
    return l;
}

//模板二 答案尽可能小
int half_2(int l,int r){
    while(l<r){
        int mid = (l+r)>>1;
        if(check(mid)){
            r = mid;
        }else{
            l = mid+1;
        }
    }
    return l;

}


数的范围

#include <iostream>
using namespace std;
const int N = 1e5+5;
int nums[N];
int main() {
    int n,m;
    cin>>n>>m;
    for(int i = 0;i<n;i++){
        cin>>nums[i];
    }
    while(m--){
        int q;
        cin>>q;
        int i,j;
        int l = 0,r = n-1;
        while(l<r){
            int mid = (l+r)>>1;
            if(nums[mid]>=q){
                r=mid;
            }else {
                l=mid+1;
            }
        }
        i = l;
        l = 0,r=n-1;
        while(l<r){
            int mid = (l+r+1)>>1;
            if(nums[mid]>q){
                r = mid-1;
            }
            else{
                l = mid;
            }
        }
        j = l;
        if(nums[l]!=q)
            cout<<-1<<' '<<-1<<endl;
        else cout<<i<<' '<<j<<endl;
    }

    return 0;
}

求n的三次根(小数二分的模板

#include <bits/stdc++.h>
using namespace std;
int main() {
    double n;
    cin>>n;
    double l = -10000,r= 10000;
    while(r-l>1e-8){
        double mid = (l+r)/2;
        if(mid*mid*mid>n){
            r = mid;
        }else
            l = mid;
    }
    printf("%6lf",l);//保留六位小数

    return 0;
}

### 回答1: 可以使用以下函数来输出一个整数逆序数: ```python def reverse_num(num): return int(str(num)[::-1]) ``` 其中,`str(num)` 将整数转换为字符串,`[::-1]` 表示将字符串反转,最后使用 `int()` 将反转后的字符串转换为整数。 例如,`reverse_num(12345)` 的输出结果为 `54321`。 ### 回答2: 逆序数是指一个整数的各位数字按照与原来的顺序相反的顺序排列组成的新整数。要实现该功能,可以定义一个函数,接受一个整数作为参数,并返回其逆序数。 具体步骤如下: 1. 定义一个函数reverse_num,该函数接受一个整数num作为参数。 2. 将参数num转换成字符串类型,便于处理每一位数字。 3. 使用字符串切片[::-1]实现倒序操作,将字符串类型的num进行反转。 4. 将反转后的字符串类型的num转换为整数类型,并将其作为函数返回值。 以下是示例代码实现上述功能: ``` def reverse_num(num): num_str = str(num) # 将整数转换为字符串 reversed_str = num_str[::-1] # 字符串切片实现倒序操作 reversed_num = int(reversed_str) # 将倒序后的字符串转换为整数 return reversed_num # 测试函数 num = 12345 reversed_num = reverse_num(num) print(reversed_num) # 输出结果:54321 ``` 通过定义函数,并通过字符串切片和类型转换,可以较为简便地实现一个整数逆序数输出。 ### 回答3: 要使用函数输出一个整数逆序数,可以定义一个函数,函数接受一个整数作为参数,并将该整数反转后输出。 具体步骤如下: 1. 定义一个函数reverse_number,函数接受一个整数n作为参数。 2. 将整数n转换为字符串类型,方便进行反转操作。 3. 使用切片操作[::-1]将字符串反转。 4. 将反转后的字符串转换为整数类型。 5. 使用print语句将反转后的整数输出。 示例代码如下所示: ``` def reverse_number(n): reversed_str = str(n)[::-1] reversed_num = int(reversed_str) print(reversed_num) # 测试 reverse_number(12345) # 输出54321 reverse_number(987654321) # 输出123456789 ``` 以上就是使用函数输出一个整数逆序数的方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值