其实排序算法的稳定很简单,就只是当每一个元素都有一个id的时候那么我们该怎么去处理大小相同的元素
如果经过排序后元素大小相同的两个元素的原顺序发生了改变则称它为不稳定排序,反之则称为稳定排序。
冒泡排序:稳定排序
选择排序:不稳定排序
下面是一个代码作为参考(随手写的,没优化过代码,别介意):
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 100 + 5;
int n;
int a[maxn];
char id_a[maxn];
int b[maxn];
char id_b[maxn];
void bubble_sort(int l,int r){
for(int i = l;i <= r-1; i++){
for(int j = r;j >= i+1; j--){
if(a[j-1] > a[j]){
int temp = a[j];
a[j] = a[j-1];
a[j-1] = temp;
char ctemp = id_a[j];
id_a[j] = id_a[j-1];
id_a[j-1] = ctemp;
}
}
}
}
void selection_sort(int l,int r){
for(int i = 1;i <= r-1; i++){
int minj = i;
for(int j = i+1;j <= r; j++){
if(b[j] < b[minj]){
minj = j;
}
}
if(minj != i){
int temp = b[i];
b[i] = b[minj];
b[minj] = temp;
char ctemp = id_b[i];
id_b[i] = id_b[minj];
id_b[minj] = ctemp;
}
}
}
void print_bubble(int l,int r){
bool flag = false;
for(int i = l; i <= r; i++){
if(flag)printf(" ");
printf("%c%d",id_a[i],a[i]);
flag = true;
}
printf("\nStable\n");
}
void print_selection(int l,int r){
bool flag = false;
for(int i = l; i <= r; i++){
if(flag)printf(" ");
printf("%c%d",id_b[i],b[i]);
flag = true;
}
for(int i = l;i <= r; i++){
if(a[i] != b[i] || id_a[i] != id_b[i]){
printf("\nNot stable\n");
return;
}
}
printf("\nStable\n");
}
int main(){
scanf("%d",&n);
for(int i = 1;i <= n; i++){
char s[3];
scanf("%s",s);
b[i] = a[i] = s[1]-48;
id_a[i] = id_b[i] = s[0];
}
bubble_sort(1,n);
selection_sort(1,n);
print_bubble(1,n);
print_selection(1,n);
}