快排(包括建树)易错点1. 递归时 第一个元素位置不是0,是看传入的第一个位置
2.快排时如果low处的元素等于high处的元素 则没必要赋值 此时也就是重复无需交换的情况。若求交换次数,则应该再赋值时候加入是否重复的判断
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>
#define MAXSIZE 55
//15.07
int count1=0;
int count2=0;
int sort(int a[],int low,int high){
int flag=a[low];//每次快排初始元素应为low
//递归到数组的不同部分初始元素应为low非0
while(low<high){
while(low<high&&a[high]>=flag)
high--;
if(a[high]!=a[low]){//数据相等时不做交换(把high给low的位置)
count1++;
a[low]=a[high];//一定先判断 再赋值
}
while(low<high&&a[low]<=flag)
low++;
if(a[high]!=a[low]){
count1++;
a[high]=a[low];
}
}
a[low]=flag;
return low;
}
void quicksort(int a[],int low,int high){
if(low<high){
int p=sort(a,low,high);
quicksort(a,low,p-1);
quicksort(a,p+1,high);
}
}
void maopao(int b[],int n){
for(int i=0;i<n;i++)
for(int j=0;j<n-i;j++)//注意<n-i是到不了n-i的,也就是到n-i-1
if(b[j]>b[j+1]){
int swap=b[j];
b[j]=b[j+1];
b[j+1]=swap;
count2++;
}
}
int main(){
int a[MAXSIZE],b[MAXSIZE];
int n,x;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&x);
a[i]=x;
b[i]=x;
}
maopao(a,n-1);
quicksort(b,0,n-1);
printf("%d %d",count2,count1);
printf("\n");
for(int i=0;i<n;i++){
a[i]=0;
b[i]=0;
}
count1=0;
count2=0;
}
}