排序算法的稳定

其实排序算法的稳定很简单,就只是当每一个元素都有一个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);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值