/*俺实在是太划水了 也太菜了 /哭 躺在床上挂机的同时 学了一哈这个 遂写了一篇完全没有水平的题解
1<n<100000;
整数最大为1e9;
在这里要 %%%yxc大佬
正在学习 水平有限 多多见谅! */
quick sort,merge sort 作者:yxc
快排:链接:https://www.acwing.com/activity/content/code/content/39784/
归并排序:链接:https://www.acwing.com/activity/content/code/content/39790/
来源:AcWing
实验表明,cin cout速度明显不如scanf和printf,当数据规模较大时更加明显
同时也有:quick_sort≈sort(无cmp默认)≈merge_sort<sort(有cmp)<<各种cin,cout
当规模较小时,可以使用cin cout快速写出答案 节省解题时间 效率相差不大
当规模较大时 使用scnaf printf,可以节省很多的运行时间
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;//define N 1000010 //定义的固定的值(范围)
int q[N];//定义数组
void quick_sort(int q[], int l, int r){//快速排序 读入 数组,左端left,右端right
if(l>=r) return ;//排除数组只有一个的情况
int i=l-1, j=r+1, x=q[l+r >> 1];// 后面dowhile会先执行一次,所以这里 i=l-1,j=r+1,x是标准值,直接取了中间那个值(实际上可以随便取) l+r>>1 相当于 l+r/2 (位运算)
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,j); //把q数组前面的部分排序(小于标准值的部分)
quick_sort(q,j+1,r); //把q数组后面的部分排序(大于标准值的部分) 同时避免了边界问题
} //最后的两个快排相当于做了递归实现
void merge_sort(int a[],int l,int r){//归并排序
if(l>=r) return ;//数组长度只有1的时候
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++]; //把小的存进去 temp是个临时存放的数组
else temp[k++]=q[j++]; //同上
while(i<=mid) temp[k++]=q[i++]; //把多的放进去 都是最大的
while(j<=r) temp[k++]=q[j++]; //把多的放进去 都是最大的
for(int i=l,j=0;i<=r;i++,j++) q[i]=temp[j]; //这个时候temp已经排好了,只需要把temp放进a中就可以了
} //归并排序相当于一段一段变成一半来排,然后再组合在一起 一层一层往回走
int cmp(int &a,int &b){
return a<b;//从小到大
}
/*
* int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&q[i]); //输入 scanf效率准确度较cin更高 当数据大的时候效率好很多
}
quick_sort(q,0,n-1); //进行优美的 双指针排序
for(int i=0;i<n;i++){
printf("%d ",q[i]); //同理 printf 比 cout 好一点
}
return 0; //这种情况 最快 为170ms 假如使用 cin cout的话 时间为 350ms 时间增加了一倍
}
*/
/*int main(){
int n;
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]);
return 0;
} 运行时间为170-180ms,使用cin cout的话 时间为380ms 时间加倍
*/
/*
* int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&q[i]);
}
sort(q,q+n,cmp); //没有cmp默认从小到大
for(int i=0;i<n;i++){
printf("%d",q[i]);
}
return 0;
} */ //这种情况耗时为221ms 假如使用cin cout的话 耗时为407ms 也几乎增加了一倍的时间
/*
* int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&q[i]);
}
sort(q,q+n); //没有cmp默认从小到大
for(int i=0;i<n;i++){
printf("%d",q[i]);
}
return 0;
} //这种情况耗时为178ms 假如使用cin cout的话 耗时为 380ms 时间也增加了一倍
*/
学习过程中的一个小实验(含快排与归并)
最新推荐文章于 2023-09-04 22:18:14 发布