您的位置:首页 > 理论基础 > 数据结构算法

数据结构实验之排序二:交换排序

2017-12-23 15:46 316 查看


Problem Description

冒泡排序和快速排序都是基于"交换"进行的排序方法,你的任务是对题目给定的N个(长整型范围内的)整数从小到大排序,输出用冒泡和快排对这N个数排序分别需要进行的数据交换次数。


Input

连续多组输入数据,每组数据第一行给出正整数N(N ≤ 10^5),随后给出N个整数,数字间以空格分隔。


Output

输出数据占一行,代表冒泡排序和快速排序进行排序分别需要的交换次数,数字间以1个空格分隔,行末不得有多余空格。


Example Input

8
49 38 65 97 76 13 27 49



Example Output

15 9



Hint

注意:数据相等时不做交换


Author

xam
#include<stdio.h>
#define N 10000
int a
, b
;
int s1, s2;
void S(int z1, int z2)
{
int t;
t = a[z1];
a[z1] = a[z2];
a[z2] = t;
s1++;
}
void P1(int n)
{
int i, flag, j;
i = n;
while(i > 1)
{
flag = 1;
for(j = 1; j < i; j++)
{
if(a[j + 1] < a[j])
{
S(j, j + 1);
flag = j;
}
}
i = flag;
}
}
void P2(int low, int high)
{
int key = b[low];
int i = low, j = high;
if(low >= high)
{
return;
}
while(low < high)
{
while(low < high && b[high] >= key)
{
high--;
}
if(b[high] < b[low])
{
s2++;
}
b[low] = b[high];
while(low < high && b[low] <= key)
{
low ++;
}
if(b[low] > b[high])
{
s2++;
}
b[high] = b[low];
}
b[low] = key;
P2(i, low - 1);
P2(high + 1, j);
}
int main()
{
int n, d;
while(~scanf("%d", &n))
{
s1 = 0;
s2 = 0;
for(int i = 1; i <= n; i++)
{
scanf("%d", &d);
a[i] = d;
b[i] = d;
}
P1(n);
P2(1, n);
printf("%d ",s1);
printf("%d\n", s2);
}
return 0;
}
欢迎提更好的意见
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: