1. 程式人生 > >SDUT3399資料結構實驗之排序二:交換排序

SDUT3399資料結構實驗之排序二:交換排序

老方法,看註釋

#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; }