尽人事,听天命。|

Jerrycyx

园龄:2年9个月粉丝:2关注:1

2024-07-29 23:20阅读: 33评论: 0推荐: 0

排序 - 题解

排序

时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 64MB,其他语言 128MB

描述

给定你一个长度为 \(n\) 的整数数列。
请你使用任意排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
数据范围 \(1≤n≤100000\)
禁止使用 sort 函数

输入描述

输入共两行,第一行包含整数 \(n\)
第二行包含 \(n\) 个整数(所有整数均在 \(0∼10^9\) 范围内),表示整个数列。

输出描述

输出格式输出共一行,包含 \(n\) 个整数,表示排好序的数列。

用例输入 1

5
3 1 2 4 5

用例输出 1

1 2 3 4 5

解析

推荐查看 https://acwing.com/solution/content/16777

代码

快排和归并都在里面了

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+5;
int n,a[N];
namespace Sort{
void Quick_Sort(int *a,int L,int R)
{
if(L>=R) return;
int l=L-1,r=R+1,pivot=a[l+r>>1];
while(l<r)
{
do l++; while(a[l]<pivot);
do r--; while(a[r]>pivot);
if(l<r) swap(a[l],a[r]);
}
Quick_Sort(a,L,r),Quick_Sort(a,r+1,R);
return;
}
void _merge(int *a,int l1,int r1, int *b,int l2,int r2, int *c,int l3)
{
while(l1<=r1&&l2<=r2)
{
if(a[l1]<=b[l2]) c[l3++]=a[l1++];
else c[l3++]=b[l2++];
}
while(l1<=r1) c[l3++]=a[l1++];
while(l2<=r2) c[l3++]=b[l2++];
return;
}
int merge_sort_tmp[N];
void Merge_Sort(int *a,int L,int R)
{
if(L>=R) return;
int mid=L+R>>1;
Merge_Sort(a,L,mid),Merge_Sort(a,mid+1,R);
// merge(a+L,a+mid+1, a+mid+1,a+R+1, merge_sort_tmp+L);
_merge(a,L,mid, a,mid+1,R, merge_sort_tmp,L);
for(int i=L;i<=R;i++) a[i]=merge_sort_tmp[i];
return;
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
Sort::Merge_Sort(a,1,n);
for(int i=1;i<=n;i++)
printf("%d ",a[i]);
return 0;
}
posted @   Jerrycyx  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起