ALDS1_2_C:StableSort

題目地址

#include<iostream>

using namespace std;

/*
 * 穩定排序定義:
 * 1. 待排序的記錄序列中可能存在兩個或兩個以上關鍵字相等的記錄。
 * 2. 排序前的序列中Ri領先於Rj(即i<j).若在排序後的序列中Ri仍然領先於Rj,則稱所用的方法是穩定的。
 * 常見的穩定排序:
 *  插入排序,基數排序,歸併排序,冒泡排序,計數排序
 * 常見的不穩定排序:
 *  快速排序,希爾排序,簡單選擇排序,堆排序
 *
 *  本題思路:
 *  利用穩定的冒泡排序的輸出結果與選擇排序的輸出結果進行比較
 *  若相同則是穩定輸出,若不同則是不穩定輸出
 */

typedef struct{
    char suit;
    char value;
}Cart;

void bubbleSort(Cart a[], int n){ // 冒泡排序
    for (int i = 0; i < n-1; i++){
        for (int j = 0; j < n-i-1; j++){
            if (a[j].value > a[j+1].value){
                swap(a[j], a[j+1]);
            }
        }
    }
}

void selectionSort(Cart a[], int n){ // 選擇排序
    for (int i = 0; i < n-1; i++){
        int pos = i;
        for (int j = i; j < n; j++){
            if (a[pos].value > a[j].value){
                pos = j;
            }
        }
        swap(a[pos], a[i]);
    }
}

void print(Cart a[], int n){ // 輸出函數
    for (int i = 0; i < n; i++){
        if (i != n-1){
            cout<<a[i].suit<<a[i].value<<" ";
        }else{
            cout<<a[i].suit<<a[i].value<<endl;
        }
    }
}

bool isStable(Cart a[], Cart b[], int n){ // 判斷選擇排序結果是否與冒泡排序結果一致
    for (int i = 0; i < n; i++){
        if (a[i].suit != b[i].suit){
            return false;
        }
    }
    return true;
}

int main(){
    Cart a[100], b[100];
    int n;
    cin>>n;
    for (int i = 0; i < n; i++){
        cin>>a[i].suit>>a[i].value;

    }
    for(int i = 0; i < n; i++){
        b[i] = a[i];
    }
    bubbleSort(a, n);
    selectionSort(b, n);
    print(a, n);
    cout<<"Stable"<<endl;
    print(b, n);
    if (isStable(a, b, n)){
        cout<<"Stable"<<endl;
    }else{
        cout<<"Not stable"<<endl;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章