冒泡排序和快速排序都是基于"交换"进行的排序方法,你的任务是对题目给定的N个(长整型范围内的)整数从小到大排序,输出用冒泡和快排对这N个数排序分别需要进行的数据交换次数。
连续多组输入数据,每组数据第一行给出正整数N(N ≤ 10^5),随后给出N个整数,数字间以空格分隔。
输出数据占一行,代表冒泡排序和快速排序进行排序分别需要的交换次数,数字间以1个空格分隔,行末不得有多余空格。
注意:数据相等时不做交换
来源
#include <stdio.h> #include <stdlib.h> int a[10010],x,y,b[10010]; int sort(int b[],int s,int r) { int i=s,j=r,key=b[s]; if(s>=r) return -1; while(i<j) { while(i<j&&b[j]>=key)j--; if(a[i]!=a[j]) {b[i]=b[j]; y++;} while(i<j&&b[i]<=key)i++; if(b[i]!=b[j]) { b[j]=b[i]; y++;}
} b[i]=key; sort(b,s,i-1); sort(b,i+1,r); } int main() { int n,i,j,t; while(~scanf("%d",&n)) { x=0; y=0; for(i=0;i<=n-1;i++) {scanf("%d",&a[i]); b[i]=a[i];} for(i=0;i<=n-2;i++) for(j=0;j<=n-2-i;j++) { if(a[j]>a[j+1]) { x++; t=a[j]; a[j]=a[j+1]; a[j+1]=t; }
} sort(b,0,n-1); printf("%d %d\n",x,y); } return 0; }