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

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

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

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

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

sort_n=(int *)calloc(ma+1,sizeof(int)); /*应用中最好加个空间判断*/
num_n=(int *)calloc(ma+1,sizeof(int));

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

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];
l++;
}
}
}

free(sort_n);
free(num_n);

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;
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();
}


很明显能看到 这个排序的方法只循环了3*N次
而且中间的计算与控制操作占用的时间非常短

缺点:在内部排序时浪费了num这个内存空间
在外部排序时要多占用一个大型数据的硬盘空间
当然这些都是在排序过程中所占用的

希望高手专家帮我评判一下这个排序方法

搜索更多相关主题的帖子: 结构 
2006-09-16 10:25
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 

哦是
忘了做了说明
昨天想着今天忘了
应该在最大值的后面加个判断
要是ML和ma差的很大的时候要做个计算
把ma重新分化一下
这样可能要增加一些运算时间
这个可能会降低效率 导致不如其他的排序方法

2006-09-16 10:56
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 

还有就是分化后有相于是3*N

2006-09-16 10:57
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
那就特别判断
还有什么特别数据:
ML特别大
MAX_N特别大
对了还有负数
2006-09-16 11:12
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
特别处理一下都没问题
2006-09-16 11:12
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
数据越大越占优势
#define ML
旁边的注释写了
2006-09-16 11:18
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 

那是所以排序方法都存在的问题
不能计算在内
我的排序方法里也没有什么多的怕这方面的问题啊
但是可能会在有符号长整形上出问题
那个我承认 这个我还没想起怎么改


[此贴子已经被作者于2006-9-16 12:41:32编辑过]

2006-09-16 11:29
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 

经过饭中思考
解决了负数的问题(包括有符号长整形的问题)
但是要浪费一个ma的循环

2006-09-16 12:42
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
我现在在做分化那一步
请老兄少安毋躁
你也应该想一下 这个问题很好解决的

但是先谢谢你的参与和提示
2006-09-16 12:45
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
以下是引用nuciewth在2006-9-16 13:38:57的发言:

到目前为止,排序的最优算法的复杂度是O(nlogn).也就说找不到比这个更好的算法了.
如果可以找到,那又是一大奇迹,楼主的程序应该是O(n^2)吧。


斑竹真是.......
你肯定没仔细看我的程序就下结论
你这么热心的人对我的程序看都不看 实在让我太气愤了

我的程序现在的最大缺点就是在 MAX_N特别大的时候特占空间 尤其是 ML和MAX_N差别特别大的时候效率特别底
就象cwande所说的
但是现在正在解决这个问题

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



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

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