SDUT 3399 数据结构实验之排序二-交换排序
2017-10-10 20:20
351 查看
数据结构实验之排序二:交换排序
Time Limit: 1000MSMemory 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;
}
相关文章推荐
- SDUT-3399 数据结构实验之排序二:交换排序(冒泡+快排)
- SDUT-3399-数据结构实验之排序二:交换排序
- 3399 数据结构实验之排序二:交换排序
- SDUT OJ 3399 数据结构实验之排序二:交换排序
- SDUT 数据结构实验之排序二:交换排序
- SDUT-3399-->数据结构实验之排序二:交换排序
- 3399-数据结构实验之排序二:交换排序
- DS-SDUT-数据结构实验之排序二:交换排序
- sdut 数据结构实验之排序五:归并求逆序数
- SDUT 3404 数据结构实验之排序七:选课名单
- 数据结构实验之排序二:交换排序
- 数据结构实验之排序二:交换排序
- 数据结构实验之排序二:交换排序
- 数据结构实验之排序二:交换排序
- SDUT 3403 数据结构实验之排序六:希尔排序
- SDUT 3401 数据结构实验之排序四:寻找大富翁 堆排序
- SDUT 3402:数据结构实验之排序五:归并求逆序数
- 数据结构实验之排序二:交换排序 oj
- SDUT-3398-->数据结构实验之排序一:一趟快排
- SDUT-3398 数据结构实验之排序一:一趟快排(水题)