java oj主机名排序_九度oj 文献排序

起因:

九度有些题目是在线测试题目,没有讨论区,这道三星题目我看AC率还是挺低的,所以贴出自己的AC代码,供大家学习讨论

考察点:

考察点在结构体的使用,用了一个数组的复制,同时注意字符串的结束符为'\0'

题目描述:现在你的导师给你了一个待排序的参考文献列表,要你排好序给他。

文献列表中每一条文献记录只占一行。排序的规则和string类型字符串的比较规则一致(在排序时如果该字符串中包含大写字母,则当作小写字母处理,保证没有相同大小的字符串,但是输出结果不能改变任一字符串),按升序排列。

输入:输入包括多组,每组输入第一行包括一个整数n,(1<=n<=200),接下来有n行,每行包括一行文献记录,文献记录的长度s(1<=s<=200)。

输出:对每组输入。输出排好序的文献记录。

样例输入:3abc hello!

Abc hellz!

bbc hello!

样例输出:abc hello!

Abc hellz!

bbc hello!

AC代码:

#include

#include

#include

#include

struct literature

{

char str1[201];

char str2[201];

};

int partition(struct literature *A, int left, int right);

void quicksort(struct literature *A, int begin, int end);

int main()

{

int n, i, j;

struct literature docus[201];

char ch;

while(scanf("%d",&n) != EOF)

{

//吸收回车符

ch = getchar();

//接收文献数据

for(i = 0; i < n; i ++)

{

gets(docus[i].str1);

}

//给区分大小写的结构体中数组赋值

for(i = 0; i < n; i ++)

{

for(j = 0; docus[i].str1[j] != '\0'; j ++)

{

if(isalpha(docus[i].str1[j]))

{

docus[i].str2[j] = tolower(docus[i].str1[j]);

}else

{

docus[i].str2[j] = docus[i].str1[j];

}

}

docus[i].str2[j] = '\0';

}

//快速排序

quicksort(docus, 0, n - 1);

//打印输出

for(i = 0; i < n; i ++)

{

printf("%s\n",docus[i].str1);

}

}

return 0;

}

void quicksort(struct literature *A, int begin, int end)

{

int pivot;

if(begin < end)

{

pivot = partition(A, begin, end);

quicksort(A, begin, pivot - 1);

quicksort(A, pivot + 1, end);

}

}

int partition(struct literature *A, int left, int right)

{

struct literature stand = A[left];

while(left < right)

{

while(left < right && strcmp(A[right].str2,stand.str2) >= 0)

{

right --;

}

if(left < right)

{

A[left ++] = A[right];

}

while(left < right && strcmp(A[left].str2,stand.str2) <= 0)

{

left ++;

}

if(left < right)

{

A[right --] = A[left];

}

}

A[left] = stand;

return left;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值