SDUT3399資料結構實驗之排序二:交換排序
阿新 • • 發佈:2018-12-19
老方法,看註釋
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int num1,num2;
void qsort(int a[],int l,int r){//基礎快排,不做贅述
if(l>=r)
return ;
int i = l;
int j = r;
int k = a[i];
while(i<j){
while(i<j && a[j]>=k)j--;
if(a[i]!=a[j])num1++;//唯獨需要的一點,如果兩個交換的值是相等的,雖然我們給交換了,其實計數的時候應該算為沒有交換過,不加
a[i] = a[j];
while(i<j && a[i]<=k)i++;
if(a[i]!=a[j])num1++;
a[j] = a[i];
}
a[i] = k;
qsort(a,l,i-1);
qsort(a,i+1,r);
}
int main()
{
int n;
int a[100010];
int b[100010];
while(cin>>n){
for(int i=0; i<n; i++){
cin>>a[i];
b[i] = a[i];//要用兩個陣列來儲存,否則給一個排序之後,另一個無法統計交換次數
}
num1 = 0;
qsort(b,0,n-1);
num2 = 0;
for(int i=0; i<=n-2; i++){//基礎冒泡
for (int j=0; j<=n-2-i;j++){
if(a[j]>a[j+1]){
num2++;
int t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
cout<<num2<<" "<<num1<<endl;
}
return 0;
}