Description
冒泡排序和快速排序都是基于"交换"进行的排序方法,你的任务是对题目给定的N个(长整型范围内的)整数从小到大排序,输出用冒泡和快排对这N个数排序分别需要进行的数据交换次数。
Input
连续多组输入数据,每组数据第一行给出正整数N(N ≤ 10^5),随后给出N个整数,数字间以空格分隔。
Output
输出数据占一行,代表冒泡排序和快速排序进行排序分别需要的交换次数,数字间以1个空格分隔,行末不得有多余空格。
Sample
Input
8
49 38 65 97 76 13 27 49
Output
15 9
Hint
注意:数据相等时不做交换
#include<iostream>
using namespace std;
int k; //k是全局变量 在调用k时,把k赋值为0
int a[100000];int b[100000];
void quicksort(int left,int right);
int main(){
int n;
while(cin>>n){
for(int i=0;i<n;i++){
cin>>a[i];
b[i]=a[i];
}
int count=0;
for(int i=n-1;i>=1;i--){
for(int j=1;j<=i;j++){
if(a[j]<a[j-1]){
int temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
count++;
}
}
}
k=0; //k先赋值
quicksort(0,n-1);
cout<<count<<" "<<k<<endl;
}
}
//不能使用int 返回
void quicksort(int left,int right){
int low=left,high=right;
int p=b[low];
if(low>=high){
return;//不可以返回0
}
while(low<high){
while(b[high]>=p&&low<high){
high--;
}
if(b[low]!=b[high]){//题目中说 相等时不交换。这一步是判断是否相等。
k++;
}
b[low]=b[high];
while(b[low]<=p&&low<high){
low++;
}
if(b[low]!=b[high]){//题目中说 相等时不交换。这一步是判断是否相等。
k++;
}
b[high]=b[low];
}
b[low]=p;
quicksort(left,low-1);
quicksort(low+1,right);
}