题意:
给一个无序的字符串,问我们怎么样一步一步地让字符串最后变成从小到大的有序的串?
通过给出一个列表L(Ai, Bi),i表示第几步,A/B表示从1开始的字符下标,A > B。
题目的意思就是让我们输出这个列表。
做法:
通过样例,我们发现用选择排序刚刚好。
首先,我们用选择排序将字符串排成从小到大有序的状态,在排序的过程中,我们用一个栈保存交换记录(A > B)。然后我们弹出栈里的记录就好了(逆序)。
#include <stdio.h>
#include <string.h>
#include <stack>
using namespace std;
typedef
struct {
int a;
int b;
}Der;
char s[1005];
stack <Der> S;
int
main() {
int len, i, j, flag, temp;
Der t;
while( scanf("%s", s) != EOF ) {
len = strlen(s);
for( i = 0; i < len - 1; i++ ) {
flag = 0;
temp = i;
for( j = i + 1; j < len; j++ ) {
if( s[j] < s[temp] ) {
temp = j;
flag = 1;
}
}
if( flag == 1 ) {
t.a = temp + 1;
t.b = i + 1;
S.push(t);
swap(s[i], s[temp]);
}
}
while( !S.empty() ) {
t = S.top();
S.pop();
printf("%d %d\n", t.a, t.b);
}
}
return 0;
}
反省:
被选择排序和冒泡排序坑了,把二者混了起来。算法/数据结构用得不多,一段时间后就有些生疏了。
// 选择排序
#include <stdio.h>
#include <algorithm>
using namespace std;
int a[1005];
int n;
void
f(int a[1005]) {
for( int i = 0; i < n; i++ ) {
printf("%d ", a[i]);
}
printf("\n");
}
int
main() {
int i, j, flag, temp;
while( scanf("%d", &n) != EOF ) {
for( i = 0; i < n; i++ ) {
scanf("%d", &a[i]);
}
for( i = 0; i < n - 1; i++ ) {
flag = 0;
temp = i;
for( j = i + 1; j < n; j++ ) {
if( a[j] < a[temp] ) {
temp = j;
flag = 1;
}
}
if( flag == 1 ) {
swap(a[i], a[temp]); // 交换次数
f(a);
}
}
}
return 0;
}
/*
10
1 9 10 2 3 5 7 4 8 6
1 2 10 9 3 5 7 4 8 6
1 2 3 9 10 5 7 4 8 6
1 2 3 4 10 5 7 9 8 6
1 2 3 4 5 10 7 9 8 6
1 2 3 4 5 6 7 9 8 10
1 2 3 4 5 6 7 8 9 10
*/