当前位置: 代码迷 >> C语言 >> [求助]最低位排序问题
  详细解决方案

[求助]最低位排序问题

热度:339   发布时间:2006-12-04 22:59:50.0
[求助]最低位排序问题

tc4.0 编译通过,但是运行时会自动跳出,我测试了应该是array_to_list和lsd_sort这两个函数有问题,但不知道问题在哪,请教各位大虾,急着要交!!!

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define CLOCKS_PER_SEC ((clock_t)1000)
#define SIZE 10000
#define MAX_R 10
#define MAX_D 5

unsigned int data[SIZE];
struct node { unsigned int data[MAX_D];
struct node *link;
};
typedef struct node NODE;

void generate_num()
{
int i;
unsigned int num[SIZE];
FILE *fp;

srand((unsigned)time(NULL));
for(i=0;i<SIZE;i++)
num[i]=(unsigned) rand();
if((fp=fopen("num.txt","w+"))==NULL)
{
printf("Can not save data !\n");
return;
}
for(i=0;i<SIZE;i++)
{
if(fwrite(&num[i],sizeof(unsigned int),1,fp)!=1)
{
printf("File write error !\n");
exit(1);
}
}
fclose(fp);
}

void load_num()
{
int i;
FILE *fp;

if((fp=fopen("num.txt","rb"))==NULL)
{
printf("Can not load data !\n");
exit(1);
}
for(i=0;i<SIZE;i++)
{
if(fread(&data[i],sizeof(unsigned int),1,fp)!=1)
{
printf("File read error !\n");
exit(1);
}
}
fclose(fp);
}

void copy_array(unsigned int num[])
{
int i;
for(i=0;i<SIZE;i++)
num[i]=data[i];
}

NODE *array_to_list(unsigned int a[],int n) /*使用数组产生链表*/
{
NODE *p,*q,*r;
int i,j;
if(n==0) return(NULL);
r=(NODE *)malloc(sizeof(NODE));
p=r;
for(i=1;i<n;i++)
{
for(j=0;j<5;j++)
p->data[j]=a[i-1]/jiecheng(j)%10;
q=(NODE *)malloc(sizeof(NODE));
p->link=q;
p=q;
}
for(j=0;j<5;j++)
p->data[j]=a[n-1]/jiecheng(j)%10;
p->link=NULL;
return(r);
}

void *lsd_sort(p,r,d) /*最低位优先排序*/
NODE *p;
int r,d;
{
NODE *head[MAX_R],*tail[MAX_R];
int i,j,k;
time_t start,end;
start=clock();

for(i=d-1;i>=0;i--)
{
for(j=0;j<r;j++)
head[j]=NULL;
while (p!=NULL)
{
k=p->data[i];
if(head[k]==NULL)
head[k]=p;
else tail[k]->link=p;
tail[k]=p;
p=p->link;
}
p=NULL;
for(j=r-1;j>=0;j--)
if(head[j]!=NULL)
{
tail[j]->link=p;
p=head[j];
}
}

end=clock();
printf("Lsd Sort cost %.3lfs\n",(end-start)*1.0/CLOCKS_PER_SEC);
}

main()
{
int i;
unsigned int temp[SIZE];
NODE *r;

generate_num(); /*随机产生10000个数并保存在num.txt文件中*/
load_num(); /*将数据从num.txt文件中读取出来,并赋给data[]*/
copy_array(temp); /*将data[]赋给temp[],用于每一次排序*/
r=array_to_list(temp,SIZE);
lsd_sort(r,MAX_R,MAX_D);

getch();
}

搜索更多相关的解决方案: 最低位  

----------------解决方案--------------------------------------------------------
漏了一个函数。。

int jiecheng(int n) /*计算10的阶乘*/
{
int i,t=1;
for(i=0;i<n;i++)
t*=10;
return (t);
}

[此贴子已经被作者于2006-12-4 23:08:15编辑过]


----------------解决方案--------------------------------------------------------
最低位排序问题
这个是什么意思,按数的最低位排序?
用输入的数以字符串输入.
判断字符串的大小(从后面开始比较),这样比较容易点.
----------------解决方案--------------------------------------------------------

我是按数据结构教材上的做的,最低位排序是基数排序的一种,对节点的最低位开始排,再按倒数第二位排,一直到最高位排,lsd_sort内的代码我是按书上抄的

[此贴子已经被作者于2006-12-4 23:43:02编辑过]


----------------解决方案--------------------------------------------------------
说个数组做的.仿照冒泡算法.
将算法中的if(a[j]>a[j+1])
换成if(bijiao(a[j],a[j+1])>0)

大致如下:
int bijiao(char a[],char b[])
{
for(i=strlen(a)-1,j=strlen(b)-1;i>=0,j>=0,i--,j--)
{
if(a[i]>b[i])
{
return 1;
}
if(a[i]<b[i])
{
return -1;
}
}
if(i==0&&j!=0)
{
return -1;
}
if(j==0&&i!=0)
{
return 1;
}
return 0;
}

----------------解决方案--------------------------------------------------------
  相关解决方案