快排:
#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;
}
排序算法
本文提供了快速排序、归并排序的实现代码,并介绍了如何通过归并排序计算逆序对数量的方法。此外,还展示了二分查找的不同应用场景及其对应的代码实现。
245

被折叠的 条评论
为什么被折叠?



