感觉编程进入状态了,这次提交直接就过了,这道题选择的是笨办法的检测排序结果是否是稳定的,复杂度是O4级别
想了一下,好像是不管使用什么更加优化的方法,都没有直接使用一个稳定的排序,然后直接用这个稳定的排序去检测这个排序结果是不是稳定的更加优秀
#include<cstdio>
#include<algorithm>
using namespace std;
struct Card
{
char suit;int num;
bool operator == (const Card& p){if(suit == p.suit && num == p.num)return true;return false;}
}cards[99999],origin[99999],save[99999];
void isStable(Card* arr,Card* contrast,int n){//第二个是对照数组
for(int i = 0;i < n;i++)
for(int j = i + 1;j < n;j++)
for(int a = 0;a < n;a++)
for(int b = a + 1;b < n;b++)
if(contrast[i].num == contrast[j].num && contrast[i] == arr[b] && contrast[j] == arr[a]){
printf("Not stable\n");
return ;
}
printf("Stable\n");
}
void print_array(Card* arr,int n){
if(n > 0)printf("%c%d",arr[0].suit,arr[0].num);
for(int i = 1;i < n;i++)printf(" %c%d",arr[i].suit,arr[i].num);
printf("\n");
}
void bubbleSort(Card* arr,int n){
bool flag = true;
for(int i = 0;flag;i++){
flag = false;
for(int j = n - 1;j > i;j--)
if(arr[j].num < arr[j - 1].num){
swap(arr[j],arr[j - 1]);
flag = true;
}
}
print_array(arr,n);
isStable(arr,origin,n);
}
void selectionSort(Card* arr,int n){
for(int i = 0;i < n;i++){
int minj = i;
for(int j = i;j < n;j++)//在i之后的数字中找到最小的那个
if(arr[j].num < arr[minj].num)
minj = j;
swap(arr[i],arr[minj]);
}
print_array(arr,n);
isStable(arr,origin,n);
}
int main(){
int n;scanf("%d",&n);
for(int i = 0;i < n;i++){
scanf("%*c %c%d",&cards[i].suit,&cards[i].num);//忽略屌开头的换行
origin[i] = cards[i];
save[i] = cards[i];
}
bubbleSort(cards,n);
selectionSort(save,n);
}