Problem Description
冒泡排序和快速排序都是基于"交换"进行的排序方法,你的任务是对题目给定的N个(长整型范围内的)整数从小到大排序,输出用冒泡和快排对这N个数排序分别需要进行的数据交换次数。
Input
连续多组输入数据,每组数据第一行给出正整数N(N ≤ 10^5),随后给出N个整数,数字间以空格分隔。
Output
输出数据占一行,代表冒泡排序和快速排序进行排序分别需要的交换次数,数字间以1个空格分隔,行末不得有多余空格。
Sample Input
8
49 38 65 97 76 13 27 49
Sample Output
15 9
Hint
注意:数据相等时不做交换
Source
xam
AC代码:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int QPsort(int a[],int n)
{
int temp = 0;
int sum = 0;
for(int i=0; i<n-1; i++)
{
for(int j=0; j<n-1-i; j++)
{
if(a[j]>a[j+1])
{
sum++;
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
return sum;
}
int num;
///关键是没有理解题目的意思。。
///题目中说的是快速排序需要交换的次数,而不是趟数!!
///快排有点特殊,就是赋值的过程实际就是交换的过程。
void qsort(int a[],int left,int right)
{
int key = a[left],i = left,j = right;
if(left>=right)
return;
while(i<j)
{
while(i<j&&a[j]>=key)///这里的>=和下面的<=其实已经限制相等的两个数不用交换。
j--;
if(i!=j)///这里的限制是同一个数不用交换。如果没有这个限制条件,就相当于相等的数进行交换了,与题意不符合。
{
num++;
a[i]=a[j];
}
while(i<j&&a[i]<=key)
i++;
if(i!=j)///同上
{
num++;
a[j]=a[i];
}
}
a[j] = key;
qsort(a,left,j-1);
qsort(a,j+1,right);
}
int main()
{
int n;
int a[(int)1e5+10];
int b[(int)1e5+10];
while(~scanf("%d",&n))
{
num = 0;
for(int i=0; i<n; i++)
{
cin>>a[i];
b[i] = a[i];
}
int s = QPsort(a,n);
qsort(b,0,n-1);
cout<<s<<" "<<num<<endl;
}
return 0;
}