设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 4995|回复: 16
打印 上一主题 下一主题

[讨论] 【纯讨论】优化一下排序算法

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1316
在线时间
831 小时
注册时间
2007-12-25
帖子
1558
跳转到指定楼层
1
发表于 2011-7-18 12:37:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
首先要说明一下什么是排序算法。
把一堆数字如
5   6  3   7   9   4  2
这些数字按从小到大的排列成
2  3  4  5  6  7  9

原有的方法我就不说了,懂编程的多少都懂一些。于是我提出一种智能一点的排序方式。

首先 获得 最大值,最小值 2    9

这两个值分别在两个头 ①  ⑦

然后依次遍历剩下的数字。
第一个数  5  
用 (5-2)/(9-2)= 3/7

于是先将5放到3/7的位置上(设法理解 3/7是在 9和2中间,因为2是在0%的位置,9是在100%的位置)

于是排列  2  5  9

第二个数 6
(6-2)/(9-2)= 4/7

于是讲5放到4/7的位置上(因为排列的3个数 于是可以认为2在0% 的位置,5在50%的位置,9在100%的位置所以6应该排在5后面)
检查6是否比50%位置上的数字大,如果小则换位,循环你懂得。
第三个数字3
(3-2)/(9-2)= 1/7
于是排到 33%之前 (因为排了4个数,于是 0%  33%  66%  100%)
2 3 5 9
检查是否比33%位置上的数字大,如果大则换位,循环你懂的。

第四个数字7
(7-2)/(9-2)=5/7 = 71.43%
于是排到 50%之后,75%之前 (因为排列5个数了,0%   25%   50%   75%   100%)
也就是放到3   5之间,
2   3   7   5   9
检查前后大小关系,于是7 和 5换位
2  3  5   7   9

…………
剩下的我就不说了。

其实这就是应用这些数据的大致规律,给一个估计插入位置,就能明显减少不必要的大小对比。
精卫赤龙腾   
总是存在一种强大,去完成似乎不可能的事情.
无畏战乾程   
或是需要一种勇气,去挑战几乎不存在的胜利.
一味玄真魂     
这是拥有一种恒心,去化解根本没有解的困难.
烈卫开天径    
只是带着一种决心,去争取残存的最后的希望。

Lv1.梦旅人

追从自然的旅行者
奇特空·煦

梦石
0
星屑
107
在线时间
1387 小时
注册时间
2010-12-31
帖子
4944

开拓者贵宾

2
发表于 2011-7-18 12:39:33 | 只看该作者
本帖最后由 Kimu 于 2011-7-18 12:41 编辑

先回帖再围观:表示OIer多用快排和二叉树排序

=================================

这个........感觉有点麻烦,编程复杂度MS较高
求源代码(麻烦用C,Pascal,Basic,Ruby中的一个)

点评

其实啊,听你这么一说,还不确定是否比二叉堆或许优于某一方面呢。  发表于 2011-7-18 14:19
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1055
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

3
发表于 2011-7-18 13:34:52 | 只看该作者
第一次找最大值的时候就有一个遍历比较了吧?

那么你在找最大值时的复杂程度就有 θ(n) 吧?而最基本的计数排序在比较理想的情况下就是 θ(n) 。

如果有负数参与进来,这个算法就要改动一下咯:

考虑输入序列: -1, -3, -9, 5, 8, 22,最小值为 -9, 最大值为22

确定 -1 的位置: (-9-(-1)) / ( 22 - (-1)) = -0.3478...

按照理论,-1 是不是应该排在 -9 之前呢?这不就和我们的期望违背了么?

点评

然后发现这是万年老坟  发表于 2011-8-15 08:02
刚想说来着  发表于 2011-8-15 07:49

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1316
在线时间
831 小时
注册时间
2007-12-25
帖子
1558
4
 楼主| 发表于 2011-7-18 14:25:31 | 只看该作者
DeathKing 发表于 2011-7-18 13:34
第一次找最大值的时候就有一个遍历比较了吧?

那么你在找最大值时的复杂程度就有 θ(n) 吧?而最基本的计 ...

这只是一个灵感,大致思路就是猜位置。
我所举的例子就好比让你手动排列这些数字,
你会首先看这个数字大小,然后把这个数字放到大致某个地方。
现在想到哈,其实一开始找最大最小值貌似也不是必须的。
然后还有一个严重的地方就是。
这数字真的可以插进去吗?如果你在第2位插入一个数字,那么后面的数字都会后推一位。
于是……
这只是一个创意。纠结这一个例子当然漏洞百出。
精卫赤龙腾   
总是存在一种强大,去完成似乎不可能的事情.
无畏战乾程   
或是需要一种勇气,去挑战几乎不存在的胜利.
一味玄真魂     
这是拥有一种恒心,去化解根本没有解的困难.
烈卫开天径    
只是带着一种决心,去争取残存的最后的希望。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1055
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

5
发表于 2011-7-18 14:26:45 | 只看该作者
九夜神尊 发表于 2011-7-18 14:25
这只是一个灵感,大致思路就是猜位置。
我所举的例子就好比让你手动排列这些数字,
你会首先看这个数字大 ...

也不说是纠结吧,思路是个好思路,但是最后反应到算法上就要考虑算法的正确性,对不对?

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7951
在线时间
1182 小时
注册时间
2007-7-29
帖子
2055
6
发表于 2011-7-18 14:35:50 | 只看该作者
新的思路,不适合用在多重复数字与复数,其他未看出。
基本上排序我直接用shell sort了。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1282
在线时间
670 小时
注册时间
2009-11-11
帖子
2790
7
发表于 2011-7-18 15:28:35 | 只看该作者
- -话说我一直用冒泡排序法

嘿。嘿。嘿
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
38 小时
注册时间
2011-1-11
帖子
44
8
发表于 2011-8-13 14:43:59 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1282
在线时间
670 小时
注册时间
2009-11-11
帖子
2790
9
发表于 2011-8-14 21:53:05 | 只看该作者
阿龙君 发表于 2011-8-13 14:43
鄙视LS,超时吧。归并排序现在最好吧,虽然写起来不简单= =不过最优化呢,内存都2G+了
另外我现实排列数字 ...

用了这么久冒泡觉的没区别,真太卡就优化下呗,现在的电脑又不是286,LS乃挖坟啦

嘿。嘿。嘿
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
38 小时
注册时间
2011-1-11
帖子
44
10
发表于 2011-8-29 18:09:40 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-22 08:30

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表