题解 | #小白鼠排队#
小白鼠排队
http://www.nowcoder.com/practice/27fbaa6c7b2e419bbf4de8ba60cf372b
// 写一个C语言版本吧
// 快速排序实现排序
// 采用指针和动态内存
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
typedef unsigned long long ull;
typedef long long ll;
#define maxv 107
// 结构体
struct Node {
int val;
char *color;
};
// 比较方式
int cmp(struct Node a, struct Node b) {
if (a.val == b.val) return strcmp(a.color, b.color) < 0;
else return a.val < b.val;
}
// 快速排序
void quick_sort(struct Node *node, int l, int r) {
if (l >= r) return;
struct Node p = *(node + l);
int i = l, j = r;
while (i < j) {
while (i < j && cmp(*(node + j), p)) --j;
if (i < j) *(node + i++) = *(node + j);
while (i < j && cmp(p, *(node + i))) ++i;
if (i < j) *(node + j--) = *(node + i);
}
*(node + i) = p;
quick_sort(node, l, i - 1);
quick_sort(node, i + 1, r);
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
struct Node *node = (struct Node *) calloc(sizeof(struct Node), n + 1);
for (int i = 0; i < n; ++i) {
(node + i)->color = (char *) calloc(sizeof(char), maxv);
scanf("%d %s", &(node + i)->val, (node + i)->color);
}
// 进行快速排序
quick_sort(node, 0, n - 1);
// 输出
for (int i = 0; i < n; ++i) {
printf("%s\n", (node + i)->color);
}
}
return 0;
}