对字符数组按ASCII码排序的问题

joysheep 2010-05-28 12:41:17
#include<stdio.h>
#include<stdlib.h>

typedef struct SqList{
int *elem;
int length;
}SqList;


/**************************快***********速**************排**************序************************/
int Partition(SqList &L,int low,int high){
int pivotkey = L.elem[low];
while(low<high){
while(L.elem[high]>pivotkey)high--;
L.elem[low] = L.elem[high];
while(L.elem[low]<pivotkey)low++;
L.elem[high] = L.elem[low];
}
return low;
}

void QSort(SqList &L,int low,int high){
if(low<high)
{int pivotloc = Partition(L,low,high);
QSort(L,low,pivotloc-1);
QSort(L,pivotloc+1,high);
}
}

void QuickSort(SqList &La){
QSort(La,0,La.length-1);
}

/**************************二***********分**************搜**************索************************/
int BinarySearch(SqList &La,int key){
int middle,left,right;
left = 0;right = La.length-1;
middle = (left + right)/2;

while(left<right){
if(key == La.elem[middle])return middle+1;
while(key>La.elem[middle]){
left = middle;middle = (left + right)/2;
}
while(key<La.elem[middle]){
right = middle;middle = (left + right)/2;
}

}
return -1;
}


void main(){
SqList La;
char n[5] = {'1','2','3','4','5'}; //建立一个字符数组,用于对顺序表初始化
La.elem = (int *)n;
La.length = 5;
QuickSort(La); //目的是按ASCII码对顺序表中元素快速排序,问题应该出在这里
char key; //键盘输入,二分搜索的关键值,即时待搜索值
printf("Please input the number U want to search:");
scanf("%c",&key);
printf("\nThe keyNum is at:%d",BinarySearch(La,(int)key)); //输出搜索结果
getchar();
}

这个程序编译运行会报错,我用跟踪执行看了。问题应该是出在快速排序函数上,函数本身没有问题,应该是“按照ASCII码排序”这个有问题。我不知道应该怎么按照ASCII排序。。请高手指点。。


...全文
721 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
周靖峰 2010-05-28
  • 打赏
  • 举报
回复
帮顶。
bobo364 2010-05-28
  • 打赏
  • 举报
回复
排序算法没有问题,int[],直接转成指针不知道有没有问题
brookmill 2010-05-28
  • 打赏
  • 举报
回复
La.elem[0] 对应 n[0]
La.elem[1] 对应 n[4]
La.elem[2] 对应 n[8]
La.elem[4] 对应 n[16]
当Partition函数里面折腾La.elem[0]~La.elem[4]的时候, 实际上操作的是n[0]到n[19]的内存空间,显然越界了,结果破坏了main的栈。
brookmill 2010-05-28
  • 打赏
  • 举报
回复
La.elem = (int *)n;
楼主可以看看这一行执行之后,La.elem[0]的值是多少?
结果是0x34333231。
这是因为n[0]到n[3]的4个字节被当成一个int了。
brookmill 2010-05-28
  • 打赏
  • 举报
回复
没时间细看算法,但是这个类型转换肯定有问题:
char n[5] = {'1','2','3','4','5'}; //建立一个字符数组,用于对顺序表初始化
La.elem = (int *)n;
这么直接转换是不行的。

要么把n改成int数组,要么把elem改成char指针。总之两个要一致才行。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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