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<stdio.h>
#include<string.h>
int setkp;//用于记录快速排序中交换的次数
int setmp;//用于记录冒泡排序中交换的次数
void kuaip(int low,int high,long long str[])//实现快速排序
{
//low和high的下标应不要轻易变更。
int i=low;
int j=high;
int mid=i;//将数组第一个数设置为枢轴。
long long swp;
if(low>high)return ;//结束快排的条件。此时也标志着每一部分的快排已经完成。
while(i<=j)
{
//条件设置为不大于即可,这样可以确保当i与j重合时,还能再判断一次枢轴和数组比较值,不然比较不全面。
for(;j>=i;)
{//先从枢轴最右边开始进行比较。
if(str[j]<str[mid])
{
swp=str[j];
str[j]=str[mid];
str[mid]=swp;
mid=j;
j--;
setkp++;
break;
}
else j--;
}
for(;i<=j;)
{
if(str[i]>str[mid])
{
swp=str[i];
str[i]=str[mid];
str[mid]=swp;
mid=i;
i++;
setkp++;
break;
}
else i++;
}
}
kuaip(low,mid-1,str);
kuaip(mid+1,high,str);
}
void maop(int n,long long str[])//实现冒泡排序
{
int flag=n;//再此之前的数据进行排序,在此之后的数据已经排序完成不需要再进行比较。
int qwer=0;//记录最后一次数据交换后,j+1的位置。
long long swp;
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<flag-1;j++)
{
if(str[j]>str[j+1])
{
swp=str[j];
str[j]=str[j+1];
str[j+1]=swp;
qwer=j+1;
setmp++;
}
}
flag=qwer;
}
return ;
}
int main()
{
int n,i;
long long str[10086],tu[10086];
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
scanf("%lld",&str[i]);
memcpy(tu,str,sizeof(str));//注意,将数组作为参数时传入函数中时,传入的是数组的地址,故若数组发生改变,则全部发生改变。
//故需要将数组进行拷贝,两个数据分别进行冒泡和快排。
setkp=0;//初始化
setmp=0;
maop(n,str);
kuaip(0,n-1,tu);
printf("%d %d\n",setmp,setkp);
}
return 0;
}
仅供参考!