#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;
}
ALDS1_2_C:StableSort
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.