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

SDUT 3399 数据结构实验之排序二-交换排序

2017-10-10 20:20 351 查看

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

Time Limit: 1000MS
Memory Limit: 65536KB
Submit

Statistic
Discuss

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

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

#include<cstdio>
#include<iostream>
using namespace std;
int num1[100005],num2[100005];
int cnt1,cnt2;
void qsort(int *num,int left,int right)
{
if(left>=right)
return;
int temp=num[left];
int first=left;
int last=right;
int flag;
while(left<right)
{
while(left<right&&num[right]>=temp)
right--;
if(num[left]!=num[right])
cnt2++;//相等的时候不计交换次数
num[left]=num[right];
while(left<right&&num[left]<=temp)
left++;
if(num[left]!=num[right])
cnt2++;
num[right]=num[left];
}
num[left]=temp;
flag=left;
qsort(num,first,flag-1);
qsort(num,flag+1,last);
}
void maopao(int *num,int n)
{
int temp;
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(num[i]>num[j])
{
cnt1++;
temp=num[i];
num[i]=num[j];
num[j]=temp;
}
}
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%d",&num1[i]);
num2[i]=num1[i];
}
cnt1=0;
cnt2=0;
maopao(num1,n);
qsort(num2,0,n-1);
printf("%d %d\n",cnt1,cnt2);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: