一道笔试题,求答案

life02 2009-08-06 01:16:34
排序一个数组 [F,a,f,h,A,g,K],要求输出[A,a,F,f,g,h,K]
...全文
475 37 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnepei 2009-08-12
  • 打赏
  • 举报
回复
#include <iostream>
#include <tchar.h>

using namespace std;

TCHAR szChar[] = {'F', 'a', 'f', 'h', 'A', 'g', 'K'};

int main()
{

int nSize = sizeof(szChar)/sizeof(szChar[0]);

for (int i = 0; i < nSize; i++)
{
int nIdx = i;
TCHAR tVal = szChar[i];
for (int j = 0; j < i; j++)
{
int nVal = (szChar[i] >= 90 ? szChar[i] - 32 : szChar[i]) - (szChar[j] >= 90 ? szChar[j] - 32 : szChar[j]);

if ( nVal<= 0 )
{

nIdx = ((szChar[i] > szChar[j]) && (nVal == 0)) ? j + 1 : j;

for (int m = i; m > nIdx; m--)
{
szChar[m] = szChar[m - 1];
}

break;
}
}

szChar[nIdx] = tVal;
}

for (int i = 0; i < nSize; i++)
{
printf("%C ", szChar[i]);
}

}
UncleQiong 2009-08-10
  • 打赏
  • 举报
回复
我记得很多书上都说,能用标准库的时候,就用标准库,所以应该使用sort吧~
dfkjsdhfks 2009-08-10
  • 打赏
  • 举报
回复
4楼的够简洁,学习。
west_point 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mstlq 的回复:]
C/C++ code#include<iostream>
#include<algorithm>
#include<cctype>usingnamespace std;bool cSmaller(char l,char r)
{return toupper(l)==toupper(r)? r>l : toupper(l)<toupper(r);
};int main ()
{char cs[7]={'F','a','f','h','A','g','K'};
sort(cs,cs+7,cSmaller);for (int i=0;i<7;++i) cout<<""<<cs[i];
cout<<endl;
system("pause");return0;
}

输出
A a F f g h K
请按任意键继续. . .

[/Quote]


顶一个!
Hertz_liu 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mosaic 的回复:]
这个就是按字符升序排,没啥吧。
[/Quote]
不是吧,g,h明显比大K大啊
ArmStronger 2009-08-10
  • 打赏
  • 举报
回复

void mySort()
{
int i,j,min;
char temp;
char cs[7]={'F','a','f','h','A','g','K'};

for (i=0;i<7;i++) //先按ASCII排序,大写字母在前,小写字母在后
{
for(j=i+1;j<7;j++)
{
if (cs[i]>cs[j])
{
temp = cs[i];
cs[i] = cs[j];
cs[j] = temp;
}
}
}

for (i=0;i<7;i++) //找到第一个小写字母的位置
{
if (cs[i]>=97)
{
min= i;
break;
}
}

while (min<7)//把小写字母插入适当的位置
{
for (i=0;i<min-1;i++)
{
if (cs[min]>=tolower(cs[i]) && cs[min]<tolower(cs[i+1]))
{
temp = cs[min];
for (j=min;j>i+1;j--)
{
cs[j]=cs[j-1];
}
cs[i+1] = temp;
}
}
min++;
}

for (i=0;i<7;++i)
{
cout<<cs[i];
}
cout << endl;
}
扬帆886 2009-08-07
  • 打赏
  • 举报
回复
mark
matrixcl 2009-08-06
  • 打赏
  • 举报
回复

//返回值0、-1、1分别对应 等于 小于 大于
int CmpChar(char ch1, char ch2)
{
assert((ch1>='a' && ch1<='z' || ch1>='A' && ch1<='Z')
&& (ch2>='a' && ch2<='z' || ch2>='A' && ch2<='Z'));
if (ch1 == ch2)
return 0;

if(ch1 >= 'A' && ch1 <= 'Z')
{
if(ch2 >= 'a' && ch2 <= 'z')
ch2 -= 'a' - 'A';
if (ch1 <= ch2) //这里如果ch1 == ch2, 说明ch1和原始的ch2是同一个字母,且ch1为大写,ch2为小写
return -1;
else
return 1;
}
else
{
if(ch2 >= 'A' && ch2 <= 'Z')
ch2 += 'a' - 'A';
if (ch1 >= ch2)
return 1;
else
return -1;
}
}

//一个普通的排序方法
void sort(char * arr, int len)
{
int i, j;
char tmp;
for (i=0; i<len; i++)
{
for (j=i+1; j<len; j++)
{
if (CmpChar(arr[j], arr[i]) < 0)//(arr[j] < arr[i]) 注意这里替换
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
}

int main(int argc,char*argv[])
{
char arr[] = {'F','a','f','h','A','g','K'};
int len = sizeof(arr) / sizeof(char);
sort(arr, len);

//OutPut
char *pTmp = new char[len+1];
strncpy(pTmp, arr, len);
pTmp[len] = '\0';
printf(pTmp);
delete [] pTmp;
}

matrixcl 2009-08-06
  • 打赏
  • 举报
回复
自己写个 compare 函数, 然后用正常的排序算法就行了

//返回值0、-1、1分别对应 等于 小于 大于
int CmpChar(char ch1, char ch2)
{
assert((ch1>='a' && ch1<='z' || ch1>='A' && ch1<='Z')
&& (ch2>='a' && ch2<='z' || ch2>='A' && ch2<='Z'));
if (ch1 == ch2)
return 0;

if(ch1 >= 'A' && ch1 <= 'Z')
{
if(ch2 >= 'a' && ch2 <= 'z')
ch2 -= 'a' - 'A';
if (ch1 <= ch2) //这里如果ch1 == ch2, 说明ch1和原始的ch2是同一个字母,且ch1为大写,ch2为小写
return -1;
else
return 1;
}
else
{
if(ch2 >= 'A' && ch2 <= 'Z')
ch2 += 'a' - 'A';
if (ch1 >= ch2)
return 1;
else
return -1;
}
}

//一个普通的排序方法
void sort(char * arr, int len)
{
int i, j;
char tmp;
for (i=0; i<len; i++)
{
for (j=i+1; j<len; j++)
{
if (CmpChar(arr[j], arr[i]) < 0)//(arr[j] < arr[i]) 注意这里替换
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
}

int main(int argc,char*argv[])
{
char arr[] = {'F','a','f','h','A','g','K'};
int len = sizeof(arr) / sizeof(char);
sort(arr, len);

//OutPut
char *pTmp = new char[len+1];
strncpy(pTmp, arr, len);
pTmp[len] = '\0';
printf(pTmp);
delete [] pTmp;
}
liuwg9999 2009-08-06
  • 打赏
  • 举报
回复

void insertsort(const char* s,char* d)
{
memset(d,0,strlen(d));
memcpy(d,s,strlen(s));
for(int i=1;i<strlen(s);i++)
{
char tmp=d[i];
int j=i;
for(;j>0&&(tmp>96?tmp-32:tmp)<(d[j-1]>96?d[j-1]-32:d[j-1])?true:((tmp>96?tmp-32:tmp)==(d[j-1]>96?d[j-1]-32:d[j-1])?(tmp<d[j-1]?true:false):false);j--)
{
d[j]=d[j-1];
}
d[j]=tmp;
}
}
zsxcn 2009-08-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mstlq 的回复:]
C/C++ code#include<iostream>
#include<algorithm>
#include<cctype>usingnamespace std;bool cSmaller(char l,char r)
{return toupper(l)==toupper(r)? r>l : toupper(l)<toupper(r);
};int main ()
{char cs[7]={'F','a','f','h','A','g','K'};
sort(cs,cs+7,cSmaller);for (int i=0;i<7;++i) cout<<""<<cs[i];
cout<<endl;
system("pause");return0;
}

输出
A a F f g h K
请按任意键继续. . .

[/Quote]

mstlq 2009-08-06
  • 打赏
  • 举报
回复
写算法?
那请楼主自己参考快速排序的算法好了^_^
只需将那里的<化作自己的比较逻辑——"不分大小写比较,同一字母则大写在前小写在后"——这样便ok了……

哪里有快速排序源码?
今天还有人发了……
http://topic.csdn.net/u/20090806/13/b810f4b6-7612-49ec-adb1-d1cbbdb37614.html
life02 2009-08-06
  • 打赏
  • 举报
回复
要求写算法,看谁的算法最高效
life02 2009-08-06
  • 打赏
  • 举报
回复
冒泡排序,还不错,还有没有其他的方法?
zhongmengqing 2009-08-06
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lijian22500 的回复:]
由小到大排序就行,accii嘛,由小到分别是A,a,F,f,g,h,K
[/Quote]但是小写的ASCII比大写的都大
zhongmengqing 2009-08-06
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 zhongmengqing 的回复:]
这应该用内排序的算法能够实现吧
[/Quote] 加上区分大小写
zhongmengqing 2009-08-06
  • 打赏
  • 举报
回复
这应该用内排序的算法能够实现吧
mstlq 2009-08-06
  • 打赏
  • 举报
回复
回楼上,楼主的问题不能直接按ascii码来排序的哦^_^
ForestDB 2009-08-06
  • 打赏
  • 举报
回复

// C
int compare(const void * a, const void * b)
{
return *(char *)a - *(char *)b;
}

char a[7] = { F, a, f, h, A, g, K, };
qsort(a, 7, sizeof(char), compare);


// C++
char a[7] = { F, a, f, h, A, g, K, };
sort(a, a + 7);
liuwg9999 2009-08-06
  • 打赏
  • 举报
回复
上边那个写乱了

void sort(const char* s,char* d)
{
memset(d,0,strlen(d));
memcpy(d,s,strlen(s));
while(*d)
{
char*p=d+1;
while(*p)
{
char d1=*d;
if(d1>96)
{
d1=d1-32;
}
char p1=*p;
if(p1>96)
{
p1=p1-32;
}
if(d1>p1)
{
char c=*d;
*d=*p;
*p=c;
}
else if(d1==p1)
{
if(*d>*p)
{
char c=*d;
*d=*p;
*p=c;
}
}
else
{
}
p++;
}
d++;
}
}

加载更多回复(17)

65,198

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧