SDUT-3399
来源:互联网 发布:绥化学院教务管理网络 编辑:程序博客网 时间:2024/05/21 06:29
交换排序的次数问题。。。
代码:
#include<bits/stdc++.h>using namespace std;int a[100010],b[100010],sum=0,sum2;void pao(int a[],int n){ int i,j; for(i=0;i<n-1;i++) for(j=n-1;j>i;j--) if(a[j]<a[j-1]) { sum++; swap(a[j],a[j-1]); }}int part(int a[],int s,int t){ int i=s,j=t; int tmp=a[i]; while(i<j) { while(i<j&&a[j]>=tmp) j--; if(i!=j) { a[i]=a[j]; sum2++; } while(i<j&&a[i]<=tmp) i++; if(i!=j)///相等不交换! { a[j]=a[i]; sum2++; } } a[i]=tmp; return i;}void quicksort(int a[],int s,int t){ int i; if(s<t) { i=part(a,s,t); quicksort(a,s,i-1); quicksort(a,i+1,t); }}int main(){ int n,i; while(cin>>n) { sum=sum2=0; for(i=0;i<n;i++) { cin>>a[i]; b[i]=a[i]; } pao(a,n); quicksort(b,0,n-1); cout<<sum<<' '<<sum2<<endl; } return 0;}
一开始也不知道快排的交换次数怎么计算,总感觉挺难的。。。(脆弱的心理)交换交换,顾名思义;自己真是太渣了,写的题还是少,就是要注意当数组的两个遍历下标相等时就不算一次交换了!因为当i和j两个遍历下标相等时,指向的是同一个数组元素!相当于自己给自己赋值了。。。
附上一张图,纪念一下:
好大一张图!!!hhhhhh。。。
阅读全文
0 0
- SDUT-3399
- SDUT-2109&&SDUT-3398
- 数据结构实验之排序二:交换排序 sdut oj 3399
- SDUT OJ 3399 数据结构实验之排序二:交换排序
- SDUT 3399 数据结构实验之排序二-交换排序
- SDUT-3399-数据结构实验之排序二:交换排序
- SDUT-3399-->数据结构实验之排序二:交换排序
- sdut 1248
- sdut 1468
- sdut 2039
- sdut 2123
- sdut Emergency
- sdut 2151
- sdut 2169
- SDUT 周赛
- SDUT 整除
- SDUT 2829
- sdut 3260
- Kafka的Replica分配策略之二 Replica变为0了怎么办
- c# 关于json 的引用
- 输入输出练习
- ARM指令集与异常处理
- MIME详解
- SDUT-3399
- 关于哥德巴赫猜想
- Visual Studio Code之常备快捷键
- 分支预测(Branch Prediction)
- retain 和 assign 的区别使用
- JAVA【多线程一】
- GAN之根据文本描述生成图像
- CCFJson查询之Java实现代码
- tornado_5_异步web服务