排序还可以这样做

比如给一个整数序列[5,5,3,3,9,9,4,4,0,0,6,6,8,8,2,2,7,7,1,1],只需要把序列中的每个元素在中间数组标识一下,如5可以标识为arrTemp[5]=1,如果序列中还有这个元素可以标识为arrTemp[5]=2,如此arrTemp=[2,2,2,2,2,2,2,2,2,2],再把arrTemp翻译为结果[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9],这样做时间复杂度为2*len,具体代码如下(未做输入参数检查):

var SF = {
    Sort : 
function(arr){
        
var arrTemp = []
        
var index = -1
        
for(var i=0; i<arr.length; i++){
            
var item = arr[i]
            //if(arrTemp[item] == 1){
           
if(arrTemp[item] >= 1){
                arrTemp[item]
++
            }
else{
                arrTemp[item] 
= 1
            }
        }
        
        
var arrR = []
        
for(var i=0; i<arrTemp.length; i++){
            
var item = arrTemp[i]
            
if(item){
                
for(var j=0; j<item; j++){
                    arrR.push(i)
                }
            }
        }
        
return arrR
    }
}
var arr = [5,5,3,3,9,9,4,4,0,0,6,6,8,8,2,2,7,7,1,1]
alert(SF.Sort(arr))
posted @ 2007-04-14 08:31 布尔 阅读(2439) 评论(19)  编辑 收藏 网摘 所属分类: 算法Javascript

  回复  引用  查看    
#1楼 2007-04-14 08:56 | 臭石头      
你这样得到的,不是排序结果吧。

搞不懂你想干什么
  回复  引用  查看    
#2楼 2007-04-14 09:05 | Cat Chen      
假如你要排序的数值范围小的话,这样做还是可以的。其实这样做相当于把需要排序的东西放到HashTable里面,然后再按顺序尝试从HashTable里面读取出来。
  回复  引用  查看    
#3楼 [楼主]2007-04-14 09:08 | 布尔      
@Cat Chen
对,我忘记考虑如果输入的序列中有超大值的话,第二个循环会非常浪费。我错了,我真的错了,时间复杂度和数据相关了,应该是2*max(len, arrMaxItem),谢谢提醒!这里给出一个“卑劣”的输入[0,99999999]
  回复  引用  查看    
#4楼 2007-04-14 11:14 | ˇ┾落≠單_      
想法是好的,行为是可耻的.
  回复  引用  查看    
#5楼 2007-04-14 12:33 | Adrian.      
传说中的.. 鸽巢排序..
  回复  引用  查看    
#6楼 [楼主]2007-04-14 13:18 | 布尔      
@ˇ┾落≠單_
不太懂你的意思,呵呵,我是早上醒来突然冒出的想法,然后就记录了下来,很不成熟啊
  回复  引用  查看    
#7楼 [楼主]2007-04-14 13:28 | 布尔      
@Adrian.
鸽巢排序 (Pigeonhole sort) — O(n+k); 需要 O(k) 额外记忆体
比较相似,谢谢提醒,我赶紧去查了一下,特点是空间复杂度会现行增长,最恶劣的时候算法不可用,看来这真不是一个好想法
  回复  引用    
#8楼 2007-04-14 14:18 | George Shui [未注册用户]
这就是Pigeonhole原理呀,但是这会有很多限制的:
1)数字值域要有范围的。
2)数字值域范围小,但数组内要排序的数字多

这只能算是在特殊情况下的特殊排序方法吧

  回复  引用  查看    
#9楼 [楼主]2007-04-14 14:21 | 布尔      
@George Shui
嗯,如果在一定的条件下算是有用吧
  回复  引用  查看    
#10楼 2007-04-14 17:12 | U2U      
无聊。用QuickSort不是可以了,这样的使用面不光。用Hashtable的。。。。我佩服,知道Hashtable的空间复杂度是怎样吗?而且Hashtable对于有重复键值的处理不了。
  回复  引用  查看    
#11楼 2007-04-14 17:15 | Jeffrey Zhao      
当时在微软面试的时候被问过这么一题,数组中有1-100的整数,用O(n)的算法排序,赫赫。
  回复  引用  查看    
#12楼 [楼主]2007-04-14 17:50 | 布尔      
@U2U
这里是用了两个数组左中间存储介质,并没有用hash哦,任何事情不光有一种处理办法,我们应鼓励创新
@Jeffrey Zhao
难道是我梦见去微软面试了?呵呵,开个玩笑
  回复  引用  查看    
#13楼 2007-04-15 10:43 | MS的明天      
看了半天没有看明白
最后调试了一下算是清楚了,有点意思~
  回复  引用    
#14楼 2007-04-15 20:28 | codefan [未注册用户]
好像有点问题,你如果数组里面有三个或三个以上相同的值的话,结果就不对了。[3,1,6,7,3,3,2,3]试试看
  回复  引用  查看    
#15楼 [楼主]2007-04-16 00:04 | 布尔      
@codefan
谢谢提醒,if(arrTemp[item] == 1){这句错了,应该if(arrTemp[item] >= 1){,已经修改好了。在次表示感谢!

  回复  引用  查看    
#16楼 2007-04-16 09:24 | 臭石头      
在范围小且大量重复数据的时候,才有意义
  回复  引用  查看    
#17楼 [楼主]2007-04-16 21:02 | 布尔      
@臭石头
完全同意
  回复  引用  查看    
#18楼 2008-07-29 18:08 | shawnliu      
就是计数排序 限制就是要排序的item是某个范围内的东西 看看算法导论就知道了 桶排比这个更加抽象一点
  回复  引用  查看    
#19楼 [楼主]2008-07-30 05:32 | 布尔      
@shawnliu
谢谢提醒,计数排序位于《算法导论》8章2节,98页,感兴趣的朋友可以读书参考。

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-04-16 00:02 编辑过
Google站内搜索
[推荐职位]上海盛大网络招聘架构师



China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接:

所属分类的其他文章:
游标清除重复数据
排序还可以这样做