`

[转]10万个浮点数排序 算法效率

阅读更多
http://bbs.9ria.com/viewthread.php?tid=75306&extra=page%3D1%26amp;orderby%3Ddateline%26amp;filter%3D2592000

呵呵,lz要去搜搜排序算法了.
自带的sort确实比冒泡,插入这些简单排序算法快.但不如一些高级排序(如快排,希尔,堆排,归并等)

另外排序和浮动数有什么关系,不知道面试官搞什么的?
他说的分开来排序应该是归并排序吧


数组长了,占内存大了,理论上来讲排序时每push一次耗时会增大。分成多个的话,push能节省时间。但是按什么分?按大小分的话还得做几十万次比较和更多次的push。根据不同的测试环境来说。。动态内存的时间损耗和浮点数大小比较的时间损耗又可能不同。

10万个,我机器上用sort测试,直接卡死。1万个勉强能跑下
只要不卡死就赢了。

在我的测试环境,测试两组1万个排序的结果,是分开排序快一些。如下代码

1万个随机数生成
var i=0
var arr=[]
for(i=0;i<10000;i++){
        arr[i]=Math.random()
}
复制代码
直接sort  2668ms
var t=getTimer()
var arr_=arr.sort()
trace(getTimer()-t)   //2668ms   
复制代码
分块sort  2194ms
var arr1=[]
var arr2=[]
var arr3=[]
var arr4=[]
var arr5=[]

for(i=0;i<10000;i++){
        var temp=arr[i]
        if(temp<.2){
                arr1.push(temp)
        }else if(temp<.4){
                arr2.push(temp)
        }else if(temp<.6){
                arr3.push(temp)
        }else if(temp<.8){
                arr4.push(temp)
        }else{
                arr5.push(temp)
        }
}

arr1.sort()
arr2.sort()
arr3.sort()
arr4.sort()
arr5.sort()

var arr_=arr1.concat(arr2).concat(arr3).concat(arr4).concat(arr5)
trace(getTimer()-t)     //2194

复制代码
我写了这么多字。能坚持看完的话就给我加点银子吧






没测试过怎么会乱说呢.
package  
{
        import flash.display.Sprite;
        import flash.text.TextField;
        import flash.utils.getTimer;
        import flash.events.*;
        /**
         * ...
         * @author ff
         */
        public class main2 extends Sprite
        {
                
                
                public function main2() 
                {
                 
                  stage.addEventListener("click", onClick);
             
                }
                
                private function onClick(e:MouseEvent):void {
                        sortTest();
                }
                
                
                private function sortTest():void {//各种排序效率测试
                        var tArr:Array = new Array();
                        var qArr:Array = new Array();
                        var iArr:Array = new Array();
                        var sArr:Array = [];
                        var gArr:Array = [];
                        var hArr:Array = [];
                        var ppArr:Array = [];
                        var selectArr:Array = [];
                        //数组的长度
                        var testLength:int = 100000;
                    //让各个数组元素随机
                        for (var i:int = 0; i <testLength; i++) {
                                var ran:int = int(Math.random() * testLength);
                                //trace("ran",ran);
                                tArr.push(ran);
                                qArr.push(ran);
                                iArr.push(ran);
                                sArr.push(ran);
                                gArr.push(ran);
                                hArr.push(ran);
                                ppArr.push(ran);
                                selectArr.push(ran);
                        }
                        var d1:int;
                        
                        
            
                        
                        /*d1 = getTimer();
                        insertSort(iArr,0,iArr.length-1);//插入
                        trace("插入排序","排列",testLength," 时间: ",getTimer() - d1);
                        
                        d1 = getTimer();
                        ppSort(ppArr);//冒泡
                        trace("冒泡排序", "排列", testLength, " 时间: ", getTimer() - d1);
                        */
                        d1 = getTimer();
                        qSort(qArr,0,qArr.length-1);//快速排序
                        trace("快速排序","排列",testLength," 时间: ",getTimer() - d1);
                        
                        d1 = getTimer();
                        shlSort(sArr,sArr.length);//希尔
                        trace("希尔排序","排列",testLength," 时间: ",getTimer() - d1);
                        
                        d1 = getTimer();
                        MgbSort(gArr,0,gArr.length-1);//归并,比希尔慢一些但他是稳定的
                        trace("归并排序","排列",testLength," 时间: ",getTimer() - d1);
                        //trace(gArr);
                        
                     d1 = getTimer();
                        tArr.sort();
                        trace("数组自带排序","排列",testLength," 时间: ",getTimer() - d1);
                }
                private function ppSort(data:Array):void {
                        var len:int = data.length;
                        var temp:int = 0;
                        for (var i:int = 0; i < len; i++) {
                                for (var j:int = len-1; j >= i; j--) {
                                        if (data[j] > data[j - 1]) {
                                                temp = data[j];
                                                data[j] = data[j - 1];
                                                data[j - 1] = temp;
                                        }
                                }
                        }
                }
                private function selectSort(data:Array):void {
                        var len:int = data.length;
                        var tempId:int;
                        var temp:int;
                        while (--len) {
                                tempId = len - 1;
                                for(var i:int=len-2;i>=0;i--){        
            if(data[i]>data[tempId]){ //如果大于,把这个索引变最大值索引
                                tempId=i;                
                        }
                }
                //最后把最大的和最后一个交换.同时在while条件中把length减一
                if(tempId!=len-1){
                temp=data[tempId];
                data[tempId]=data[len-1];
                data[length-1]=temp;
                }
        
                        }
                }
                private function qSort(data:Array, left:int, right:int):void {
           var min:int=left;
        var max:int=right;

        var key:int=data[left];
        var temp:int;
        while (true) {        
        while(min<max&&data[max]>=key){
         max--; 
        }
        while(min<max&&data[min]<=key){
     min++;
        }
        
        if(min<max){
                temp=data[min];
                data[min]=data[max];
                data[max]=temp;
          
        }else{//min==max 结束循环
                break;
        }
        }
        data[left]=data[min];
        data[min]=key;
        if(min-1>left){
     qSort(data,left,min-1);
        }
        if(max+1<right){
     qSort(data,max+1,right); 
    }
                }
                
        private function insertSort(a:Array,start:int,n:int):void {
                for(var i:int = start-1; i < n; i++)
        {
        var temp:int= a[i];
        for (var j:int = i; j > start && temp < a[j - 1]; j--)
        {
         a[j] = a[j - 1];
                        }
          a[j] = temp;
                }
        }
        private function shlSort(p:Array,n:int):void {
                var k:int;
                var i:int;
                var j:int;
            var t:int;
        k=n/2;        
        while(k>0)                
        {                
                for(j=k;j<=n-1;j++)                        
                {                        
                        t=p[j];i=j-k;                        
                        while((i>=0)&&(p[i]>t))                                
                        {                                
                                p[i+k]=p[i];i=i-k;                        
                        }                        
                        p[i+k]=t;                        
                }
                k=k/2;                
        }        
        
        }
        
        private function gbSort(data:Array, left:int, right:int):void {
                var  len:int = (right - left) + 1;
                var center:int = len/2 + left;
                var tempData:Array = [];
                var index:int = 0;
                var i:int;
                var d1Index:int=left;
                var d2Index:int = center;//搞了半天,这里的center错写成right了.苦啊
    while(d1Index<center&&d2Index<=right){
                
                if(data[d1Index]>data[d2Index]){
        tempData[index++]=data[d2Index++];
                }else{
        tempData[index++]=data[d1Index++];
                }        
        }
        
        while(d1Index<center){
      tempData[index++] = data[d1Index++];
         
        }

        while(d2Index<=right){//同上
                tempData[index++] = data[d2Index++];
                
        }
        for(i=0;i<len;i++){
                data[left+i]=tempData[i];
        }        
        }
        private function MgbSort(a:Array,left:int,right:int):void{
        if (left < right)
        {
                var center:int = left+(right-left+1) / 2;//取得中点
                //将原来序列分为两段
                MgbSort(a, left, center-1);
                MgbSort(a, center, right);
                //合并刚才分开的两段,得到原来序列的有序序列
                //trace("center",center);
                gbSort(a,left,right);
        }
        }
        }

}


点击鼠标就可以输出结果了,简单排序注释了,因为非常慢(你可以试试).
debug测试和release测试得的结果是不一样的,最终效率当然以release为准.
想看到release的结果请自己加一个txt让结果显示出了.

release模式下,sort比其他几个高级排序慢10倍或者以上
分享到:
评论

相关推荐

    16进制转浮点数的算法

    在“浮点数16机制”这个主题中,我们关注的是如何理解和实现这两种转换,特别是当涉及到浮点数的二进制表示(即IEEE 754标准)。IEEE 754标准定义了浮点数的存储结构,包括符号位、指数和尾数等部分。在进行16进制到...

    TMS320C3x浮点数简介、IEEE754的32位转VC33的32位浮点数算法、IEEE754的64位浮点数转VC33的40位浮点数算法

    当涉及到64位IEEE 754双精度浮点数到40位VC33浮点数的转换时,这个过程更为复杂。双精度浮点数包含1位符号位、11位指数和52位尾数。由于40位VC33格式无法完全容纳所有64位的信息,因此必须进行舍入操作,可能会影响...

    4字节浮点数算法

    ### 4字节浮点数算法解析 #### 一、基本概念 在计算机科学中,浮点数是一种能够表示实数的数据类型,广泛应用于需要精确处理小数的场景。4字节浮点数通常指的是使用32位来存储一个浮点数的方式。这种格式遵循IEEE ...

    float_2_char.zip_C51 float转char_单片机 浮点数_浮点数 char_浮点数 转换_浮点数转换

    在处理浮点数时,需要额外的库函数或者自定义算法来完成转换。C51可能不直接支持浮点数到字符的转换,因此,提供的`float_2_char`代码可能是实现了这种转换的自定义函数。 6. **优化与注意事项** 在单片机中进行...

    十六进制转浮点数,十六进制转浮点数在线,LabView

    "十六进制转浮点数.vi"这个文件很可能是一个LabVIEW VI,它实现了上述转换功能。使用这个VI时,你需要将16进制的字符串输入到VI中,VI会输出相应的浮点数。如果你需要查看或修改这个VI的工作原理,可以打开它来查看...

    4字节16进制数转换为float浮点数的原理及Qt算法实现示例

    单精度浮点数在内存中由32位组成,分为四个部分:符号位(1位)、指数部分(8位)和尾数部分(23位)。其中,符号位决定数值的正负,指数部分存储指数(以偏移量形式),尾数部分存储小数部分。在进行十六进制到...

    十进制浮点数转IEEE754浮点数

    十进制浮点数转IEEE754浮点数,利用C语言中的union

    HEX与浮点数相互转换

    至于压缩包中的文件名,“mingwm10.dll”通常是一个动态链接库文件,用于Windows平台上的MinGW编译环境,它提供了对Windows API的接口,可能包含与HEX和浮点数转换相关的函数。而“Hex&Float-s.exe”看起来是一个可...

    浮点数的DFA识别算法

    `Form1.cs`可能是用于创建用户界面的代码,而`浮点数的DFA.exe`是编译后的可执行文件,用于运行这个浮点数识别算法。 总的来说,DFA识别浮点数算法涉及到状态设计、状态转换规则的制定以及输入字符的处理逻辑。通过...

    十六进制数转换为浮点数浮点数转换

    十六进制到浮点数的转换通常涉及以下几个步骤: 1. **十六进制到二进制转换**:首先,我们需要将十六进制数转换成二进制形式。每个十六进制数字对应四位二进制数,例如,A = 1010, B = 1011, C = 1100, D = 1101, E...

    javaScript实现浮点数转十六进制字符

    JavaScript实现浮点数转十六进制字符的过程涉及到了浮点数的表示、IEEE 754标准、二进制与十六进制的转换等多个知识点。由于JavaScript直接使用浮点数转十六进制的功能实现并不直接,因此需要借助其他方法来实现。...

    基于FPGA的浮点数线性排序器设计.pdf

    浮点数排序器的设计采用了N个排序节点串联,形成一个完整的排序器。其中,N表示待排序数据的数量。为了保证排序过程的高效执行,采用流水线的方式,通过两个系统状态标签来驱动节点内的控制逻辑,以此确定新数据的...

    浮点数与十进制数转换工具

    这就是著名的浮点数舍入误差问题,它在计算领域是一个重要的概念,需要在设计算法和编写代码时予以考虑。 在编程语言中,如Python、Java、C++等,都有内置的函数或者库来支持浮点数和十进制数之间的转换,例如...

    labview十六进制转浮点数程序

    在本案例中,我们讨论的是一个LabVIEW程序,名为“十六进制转浮点数.vi”,它专门用于处理与下位机通信过程中涉及的十六进制和浮点数之间的转换问题。下位机通常采用这种格式传递数据,因为十六进制表示形式更利于...

    16进制与10进制浮点数互转工具

    标题中的“16进制与10进制浮点数互转工具”指的是一个软件应用,它能够帮助用户将基于IEEE 754标准的16进制表示的浮点数转换为十进制形式,反之亦然。这样的工具对于理解和调试涉及浮点数计算的程序非常有用,尤其是...

    面试之大数找关键值(如从10亿个浮点数中找出最大的1万个)

    "面试之大数找关键值(如从10亿个浮点数中找出最大的1万个)" 本文讨论了一道常见的笔试面试题目:从10亿个浮点数中找出最大的1万个。这个问题看似简单,但实际上却具有很高的难度,因为处理如此大量的数据需要考虑...

    用Verilog实现整数转浮点数

    CHQsqrt_float这个文件名可能是用于实现平方根运算的Verilog模块,这对于浮点数转换也非常重要,因为浮点数的平方根通常不直接可用,需要通过特定的算法如新二分法(Babylonian method)或快速傅里叶变换(FFT-based...

    浮点数与定点数的相互转换

    ### 浮点数与定点数的相互转换 #### 一、引言 在计算机科学领域,数据表示方式的选择...总之,掌握浮点数与定点数之间的相互转换不仅能够帮助我们在实际编程过程中更加灵活地处理数值问题,还能提高程序的整体效率。

    四字节和10进制浮点数互转.rar

    在VB写上位机与仪表设备通信时,经常会遇到需要将返回的四字节数据转换成10进制...本实例就是实现IEEE-574四字节转10进制浮点数,以及10进制转IEEE-574四字节数据。希望能给做项目卡在这一个问题上的朋友们有帮助。

Global site tag (gtag.js) - Google Analytics