| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2018 人关注过本帖
标题:[原创]自创的结构排序 只循环3*N次
只看楼主 加入收藏
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 

实在太累了
昨天去逛街 今天是撑不下去了
所以先把我改的程序先传上来
大家先看一下
这个程序还没解决MAX_N过大后的分化问题
但是解决负数等问题(没写注释,见凉):


#include "stdio.h"
#include "stdlib.h"
#include "time.h"

#define ML 20 /*数值比较小的时候属于内部排序*/
/*在大型数据里,进行外部排序的时候,由于sort_n占的空间由数据最大值决定*/
/*虽然num_n的空间大小和数据大小有点关系,但是影响并不是很大?*/
/*所以这个方法也使用于大型排序*/
#define MAX_N 25 /*如果数据最大值特别大的话,可以进行层次排序那样可能多循环一些次数*/

int *jgsort(int num[],int len) /*结构排序*/
{
int *sort_n,*num_n,*snum,*sort_n_f,*num_n_f;
int i,j,l=0; /*不同数据量定义不同的变量类型*/
int ma=0,mi=0,fu=0;

snum=(int *)calloc(len,sizeof(int));
for(i=0;i<ML;i++) /*如果你知道最大值可以省去这个N次循环*/
{
ma=ma>num[i]?ma:num[i];
mi=mi<num[i]?mi:num[i];
if(num[i]<0)
fu=1;
}
if(ma>ML*20)
{

}
if(mi>0)
ma-=mi;

sort_n=(int *)calloc(ma+1,sizeof(int));
num_n=(int *)calloc(ma+1,sizeof(int));
if(fu)
{
sort_n_f=(int *)calloc(1-mi,sizeof(int));
num_n_f=(int *)calloc(1-mi,sizeof(int));
}/*应用中最好加个空间判断*/

for(i=0;i<ML;i++) /*进行结构储存*/
{
if(num[i]>=0)
{
if(sort_n[num[i]-mi*(mi>0)])
num_n[num[i]-mi*(mi>0)]++;
else
sort_n[num[i]-mi*(mi>0)]=i+1;
}
else
{
if(sort_n_f[-num[i]])
num_n_f[-num[i]]++;
else
sort_n_f[-num[i]]=i+1;
}
}

l=0;
if(fu==1)
{
for(i=-mi;i>=0;i--) /*进行重组装*/
{if( sort_n_f[i]>ML ) printf("%-4diiii %-3d i#",i,sort_n_f[i]-1);
if(sort_n_f[i])
{
for(j=0;j<=num_n_f[i];j++)
{
snum[l]=num[sort_n_f[i]-1];
l++;
}
}
}
}
for(i=0;i<=ma;i++)
{
if(sort_n[i])
{
for(j=0;j<=num_n[i];j++)
{
snum[l]=num[sort_n[i]-1+mi*(mi>0)];
l++;
}
}
}
free(sort_n);
free(num_n);
if(fu)
{
free(sort_n_f);
free(num_n_f);
}

return snum;
}

int sort(int num[],int len) /*冒泡排序*/
{
int l,i,j;

for(i=0;i<len-1;i++)
for(j=i;j<len;j++)
{
if(num[i]>num[j])
{
l=num[i];
num[i]=num[j];
num[j]=l;
}
}
}

void main()
{
int num[ML],*snum;
int i;

srand((unsigned)time(NULL)); /*产生数据*/
for(i=0;i<ML;i++)
{
num[i]=rand()%MAX_N+50;
printf("%3d ",num[i]);
}

snum=jgsort(num,ML);/*获得排序后的数据*/

puts("");
for(i=0;i<ML;i++)
{
printf("%3d ",snum[i]);
}

sort(num,ML); /*用冒泡排序做个验证*/

puts("");
for(i=0;i<ML;i++)
{
printf("%3d ",num[i]);
}
getch();
}


2006-09-16 16:28
robin_007
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2006-8-21
收藏
得分:0 

支持原创!!!
恭喜楼主了.下次数据结构将会出现亮哥排序法

2006-09-16 21:13
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
以下是引用robin_007在2006-9-16 21:13:19的发言:

支持原创!!!
恭喜楼主了.下次数据结构将会出现亮哥排序法

我也这么想

2006-09-16 21:35
cordier
Rank: 2
等 级:论坛游民
威 望:1
帖 子:449
专家分:14
注 册:2006-2-9
收藏
得分:0 
我觉得这不可思议,这应当是数学家的事。楼主的精神还是支持一下的。

2006-09-16 21:58
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
以下是引用cordier在2006-9-16 21:58:07的发言:
我觉得这不可思议,这应当是数学家的事。楼主的精神还是支持一下的。

王力的 怀疑与学问 是我学习的准则 我很钦佩王力先生
还有就是 这个东西未必是数学家的事 我在<程序员>的杂志上看到某位仁兄把贝尔实验室做的程序效率提高了几十倍
事后他说 那里的全是数学家转过来研究计算机的 所以他们的思维全是运算思维 而结构思维要差一些

申明:这个程序现在还在完善

顺便庆祝一下我的 第600张 帖

2006-09-16 22:07
快速回复:[原创]自创的结构排序 只循环3*N次
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021055 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved