解题思路
就是普通排序的变体,把key值换成了字符串
可以用简单排序暴力破解。
或者用桶排序处理。
各有各的应用场景
暴力简单排序
段错误的原因有很多。数组超出长度是其一。这里数组长度要设置为101。
可变长数组不能初始化。
#include<stdio.h>
#include<string.h>
int InsertSort(char str[][101], int n)
{
int size = n - 1;
int temp = n - 1;
int i ;
char c[101] ="";
for (i = 0; i < size; i++) {
if (strcmp(str[i],str[temp]) > 0) {
strcpy(c, str[temp]);
temp = i;
break;
}
}
for (i = size; i > temp; i--) {
strcpy(str[i], str[i - 1]);
}
if (temp != n - 1) {
strcpy(str[i], c);
}
return 0;
}
int main()
{
int n;
while (scanf("%d", &n) != EOF) {
char str[n][101];
memset(str, 0, sizeof(str));
for (int i = 0; i < n; i++) {
scanf("%s", str[i]);
InsertSort(str, i + 1);
}
for (int i = 0; i < n; i++) {
printf("%s\n", str[i]);
}
}
return 0;
}桶排序
桶排序和hashmap好像啊。hashmap里面加上排序就可以变成桶排序了。
不过两者的思想不一样。桶排序是在不同段里面进行排序,hash是映射进行查找。
下面的代码算是结合了桶排序结合了hash关系。
eg:
断点调试是个好东西呀,害!
传出指针要用指针的指针。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX_SIZE 101
#define DAXIE 65
#define XIAOXIE 97
typedef struct _StrNode {
struct _StrNode *next;
char str[];
}StrNode;
typedef struct _StrBucket {
int bucketCount;
StrNode *bucketNum[];
}StrBucket;
int BucketRelation(int key)
{
return ((key >= XIAOXIE) ? (key - XIAOXIE + 26) : (key - DAXIE));
}
int InitBucket(StrBucket **bucket, int bucketSize)
{
StrBucket *bucketTemp = (StrBucket *)malloc(sizeof(StrBucket) + bucketSize * sizeof(StrNode));
bucketTemp->bucketCount = bucketSize;
while (bucketSize--) {
bucketTemp->bucketNum[bucketSize] = (StrNode *)malloc(sizeof(StrNode) + sizeof(char));
bucketTemp->bucketNum[bucketSize]->next = 0;
bucketTemp->bucketNum[bucketSize]->str[0] = 0;
}
*bucket = bucketTemp;
return 0;
}
int BucketSort(StrBucket *bucket, char *str)
{
int site = BucketRelation(str[0]);
StrNode *node = (StrNode *)malloc(sizeof(StrNode) + strlen(str));
StrNode *point = bucket->bucketNum[site];
node->next = 0;
strcpy(node->str, str);
if (!(point->next)) {
point->next = node;
} else {
while (point->next) {
if (strcmp(node->str, point->next->str) > 0) {
point = point->next;
} else {
break;
}
}
node->next = point->next;
point->next = node;
}
return 0;
}
int OutputBucket(StrBucket *bucket)
{
int i;
StrNode *point;
for (i = 0; i < bucket->bucketCount; i++) {
point = bucket->bucketNum[i]->next;
while(point) {
printf("%s\n", point->str);
point = point->next;
}
}
return 0;
}
int FreeBucket(StrBucket *bucket)
{
int i;
StrNode *point, *temp;
for (i = 0; i < bucket->bucketCount; i++) {
point = bucket->bucketNum[i];
while(point) {
temp = point->next;
point->next = 0;
free(point);
point = temp;
}
}
free(bucket);
return 0;
}
int main()
{
int n;
char str[MAX_SIZE] = "";
StrBucket *bucket;
while (scanf("%d", &n) != EOF) {
bucket = 0;
InitBucket(&bucket, 52);
while(n--) {
memset(str, 0 , sizeof(str));
scanf("%s", str);
BucketSort(bucket, str);
}
OutputBucket(bucket);
FreeBucket(bucket);
}
return 0;
}

京公网安备 11010502036488号