• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 0,  comments - 5,  trackbacks - 0
            Thursday, June 28, 2012
            這兩天比較閑,復(fù)習(xí)了一下算法中的基本排序算法。
            挑選了3種比較經(jīng)典的排序算法進(jìn)行了實(shí)現(xiàn)并測(cè)試。
            1.   基數(shù)排序
            typedef std::queue<int> BUCKET;
            #define ONEBITMAX 16

            void Straight_Radix(int nArray[], int nArrayNO, int nElementBits)
            {
                BUCKET pBucket[ONEBITMAX];
                
            int nBucketIndex, nArrayIndex;
                
            for (int k = 0; k < nElementBits; k++)
                
            {       
                    nArrayIndex 
            = 0;
                    
            for (int i = 0; i < nArrayNO; i++)
                    
            {
                        nBucketIndex 
            = (nArray[i] & (0xf << (4*k))) >> (4*k);
                        pBucket[nBucketIndex].push(nArray[i]);
                    }


                    
            for (int i = 0; i < ONEBITMAX; i++)
                    
            {
                        
            while(!pBucket[i].empty())
                        
            {
                            nArray[nArrayIndex
            ++= pBucket[i].front();
                            pBucket[i].pop();
                        }

                    }

                }

            }
            由于用了stl queue所以導(dǎo)致效率有一定降低,而且使用的16個(gè)桶占用了很多額外的空間。
            O(kn)
            2.   快速排序
            int Partition(int nArray[], int Left, int Right)
            {
                
            int nPivot = nArray[Left];
                
            int nMiddle, L, R;
                
            int nTemp;
                L 
            = Left;
                R 
            = Right;

                
            while(1)
                
            {
                    
            while(nArray[L] <= nPivot && L<=Right)
                    
            {
                        L
            ++;
                    }

                    
            while(nArray[R] > nPivot && R >= Left)
                    
            {
                        R
            --;
                    }

                    
            if (L >= R)
                    
            {
                        
            break;
                    }

                    
            if (nArray[L] > nArray[R])
                    
            {
                        nTemp 
            = nArray[R];
                        nArray[R] 
            = nArray[L];
                        nArray[L] 
            = nTemp;
                    }

                }


                nMiddle 
            = R;
                nTemp 
            = nArray[Left];
                nArray[Left] 
            = nArray[nMiddle];
                nArray[nMiddle] 
            = nTemp;
                
            return nMiddle;
            }


            void Q_Sort(int nArray[], int Left, int Right)
            {
                
            if (Left < Right)
                
            {
                    
            int nMiddle = Partition(nArray, Left, Right);
                    Q_Sort(nArray, Left, nMiddle 
            - 1);
                    Q_Sort(nArray, nMiddle 
            + 1, Right);
                }

            }


            void QuickSort(int nArray[], int nArrayNO)
            {
                Q_Sort(nArray, 
            0, nArrayNO - 1);
            }
            O(nlogn)如果當(dāng)數(shù)組小于一定規(guī)模(10-20)采用插入排序,可以減少一定的時(shí)間
            3.   堆排序
            void Build_heap(int nArray[], int nHeapSize) //from 1 to nHeapSize
            {
                
            int nParent, nTemp, nLeft, nRight;
                
            for (int i = nHeapSize / 2 + 1; i >= 1; i--)
                
            {
                    nParent 
            = i;
                    
            while(1)
                    
            {
                        nLeft 
            = nParent * 2;
                        nRight 
            = nParent * 2 + 1;
                        
            if (nLeft > nHeapSize)
                        
            {
                            
            break;
                        }

                        
            else if (nHeapSize == nLeft)
                        
            {
                            
            if (nArray[nParent] < nArray[nLeft])
                            
            {
                                nTemp 
            = nArray[nParent];
                                nArray[nParent] 
            = nArray[nLeft];
                                nArray[nLeft] 
            = nTemp;
                            }

                            
            break;
                        }

                        
            else
                        
            {
                            
            if (nArray[nLeft] >= nArray[nRight])
                            
            {
                                
            if (nArray[nParent] < nArray[nLeft])
                                
            {
                                    nTemp 
            = nArray[nParent];
                                    nArray[nParent] 
            = nArray[nLeft];
                                    nArray[nLeft] 
            = nTemp;
                                    nParent 
            = nLeft;
                                    
            continue;
                                }

                            }

                            
            else
                            
            {
                                
            if (nArray[nParent] < nArray[nRight])
                                
            {
                                    nTemp 
            = nArray[nParent];
                                    nArray[nParent] 
            = nArray[nRight];
                                    nArray[nRight] 
            = nTemp;
                                    nParent 
            = nRight;
                                    
            continue;
                                }

                            }

                            
            break;
                        }

                    }

                }

            }


            void Rearrange_Heap(int nArray[], int nHeapSize)
            {
                
            if (1 == nHeapSize)
                
            {
                    
            return;
                }


                
            int nParent, nTemp, nLeft, nRight; 
                nParent 
            = 1;
                
            while(1)
                
            {
                    nLeft 
            = nParent * 2;
                    nRight 
            = nParent * 2 + 1;
                    
            if (nLeft > nHeapSize)
                    
            {
                        
            break;
                    }

                    
            else if (nHeapSize == nLeft)
                    
            {
                        
            if (nArray[nParent] < nArray[nLeft])
                        
            {
                            nTemp 
            = nArray[nParent];
                            nArray[nParent] 
            = nArray[nLeft];
                            nArray[nLeft] 
            = nTemp;
                        }

                        
            break;
                    }

                    
            else
                    
            {
                        
            if (nArray[nLeft] >= nArray[nRight])
                        
            {
                            
            if (nArray[nParent] < nArray[nLeft])
                            
            {
                                nTemp 
            = nArray[nParent];
                                nArray[nParent] 
            = nArray[nLeft];
                                nArray[nLeft] 
            = nTemp;
                                nParent 
            = nLeft;
                                
            continue;
                            }

                        }

                        
            else
                        
            {
                            
            if (nArray[nParent] < nArray[nRight])
                            
            {
                                nTemp 
            = nArray[nParent];
                                nArray[nParent] 
            = nArray[nRight];
                                nArray[nRight] 
            = nTemp;
                                nParent 
            = nRight;
                                
            continue;
                            }

                        }

                        
            break;
                    }

                }

            }


            void HeapSort(int nArray[], int nArrayNO)
            {
                Build_heap(nArray, nArrayNO 
            - 1);
                
            int nTemp;
                
            for (int i = nArrayNO - 1; i >= 2; i--)
                
            {
                    nTemp 
            = nArray[1];
                    nArray[
            1= nArray[i];
                    nArray[i] 
            = nTemp;
                    Rearrange_Heap(nArray, i 
            - 1);
                }
                

                
            //insert index 0
                int nIndex = 0;
                
            for (int i = 1; i < nArrayNO; i++)
                
            {
                    
            if (nArray[nIndex] <= nArray[i])
                    
            {
                        
            break;
                    }

                    nTemp 
            = nArray[nIndex];
                    nArray[nIndex] 
            = nArray[i];
                    nArray[i] 
            = nTemp;
                    nIndex 
            = i;
                }

            }
            O(nlogn)


            測(cè)試:在2.7G*2 CPU,3.4G內(nèi)存的pc上,隨機(jī)生成的1億個(gè)最大值為2的31次的整數(shù)作為測(cè)試用例。
            測(cè)試方法:
            #include <stdio.h>
            #include 
            <stdlib.h>
            #include 
            <string.h>
            #include 
            <time.h>
            #ifdef QSORT
            #include 
            "QuickSort.h"
            #endif
            #ifdef HEAPSORT
            #include 
            "HeapSort.h"
            #endif
            #ifdef BUCKETSORT
            #include 
            "Straight_Radix.h"
            #endif



            const int ARRAYNO = 100000000;
            int unSortedArray[ARRAYNO];

            void CreateUnSortedArray()
            {
                
            int nRand;
                FILE 
            *fp = fopen("UnSortedArray.log""wb");
                
            for (int i = 0; i < ARRAYNO; i++)
                {
                    nRand 
            = (rand() << 15+ rand();
                    fprintf(fp, 
            "%d\n", nRand);
                }    
                fclose(fp);
            }

            bool LoadUnSortedArray()
            {
                FILE 
            *fp = fopen("UnSortedArray.log""r");
                
            if (NULL == fp)
                {
                    
            return false;
                }
                
            char szBuffer[256];
                memset(unSortedArray, 
            0sizeof(int* ARRAYNO);
                memset(szBuffer, 
            0 , 256);
                
            int nArrayIndex = 0;
                
            while(fgets(szBuffer, 255, fp))
                {
                    unSortedArray[nArrayIndex
            ++= atoi(szBuffer);
                    memset(szBuffer, 
            0 , 256);
                }
                fclose(fp);
                
            return true;
            }

            bool SaveSortedArray(int nTime)
            {
                FILE 
            *fp = fopen("SortedArray.log""wb");
                
            if (NULL == fp)
                {
                    
            return false;
                }
                fprintf(fp, 
            "time cost %dms\n", nTime);
                
            for (int i = 0;  i < ARRAYNO; i++)
                {
                    fprintf(fp, 
            "%d\n", unSortedArray[i]);
                }
                fclose(fp);
                
            return true;
            }

            void main()
            {
                
            //CreateUnSortedArray();
                if(!LoadUnSortedArray())
                {
                    printf(
            "Load unsortedArray failed!\n");
                    
            return;
                }
                
            int nStart = clock();

                #ifdef QSORT
                QuickSort(unSortedArray, ARRAYNO);
            #endif

            #ifdef HEAPSORT
                HeapSort(unSortedArray, ARRAYNO);
            #endif

            #ifdef BUCKETSORT
                Straight_Radix(unSortedArray, ARRAYNO, 
            8);
            #endif

                SaveSortedArray(clock() 
            - nStart);

                
                system(
            "pause");
            }
            測(cè)試結(jié)果:()中為快速排序+插入排序的時(shí)間
                 
            基數(shù)排序 快速排序 堆排序
            time 45093ms 14797ms(13625ms) 77047ms
            按理論堆排序和快速排序應(yīng)該差不多,不明原因。
              
            posted on 2012-06-28 18:02 saha 閱讀(437) 評(píng)論(1)  編輯 收藏 引用

            FeedBack:
            # re: 三種經(jīng)典排序算法比較
            2012-09-11 15:58 | corey
            取一個(gè)例子,雖然是隨機(jī)生成的數(shù)組,也有可能有隨機(jī)性;
            多取一些例子求平均值試試。  回復(fù)  更多評(píng)論
              

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理



            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿

            文章分類

            文章檔案

            收藏夾

            搜索

            •  

            最新評(píng)論

            国産精品久久久久久久| 欧美色综合久久久久久| 国产精品青草久久久久福利99| 内射无码专区久久亚洲| 久久久久久九九99精品| 久久久久国产一区二区| 久久精品国产久精国产思思| 日日狠狠久久偷偷色综合0| 国产精品久久久久久影院| 久久99热这里只有精品66| 久久久久国产视频电影| 国产精品久久久久久影院 | 日本精品久久久久中文字幕8| 2021国产精品久久精品| 久久国产综合精品五月天| 国产精品对白刺激久久久| 久久无码AV一区二区三区| 久久久中文字幕日本| 亚洲国产成人久久综合碰碰动漫3d| 97久久国产综合精品女不卡| 久久久久久久久久久免费精品| 99久久精品国产一区二区三区| 久久久婷婷五月亚洲97号色| 久久无码中文字幕东京热| 一本综合久久国产二区| 开心久久婷婷综合中文字幕| 国产精品美女久久久免费| 久久久久久综合一区中文字幕| 日产精品久久久久久久| 亚洲精品国精品久久99热一| 2021国产精品久久精品| 久久精品国产久精国产果冻传媒 | 无码AV中文字幕久久专区| 77777亚洲午夜久久多喷| 国产成人综合久久精品红| 久久这里的只有是精品23| 亚洲一级Av无码毛片久久精品| 亚洲精品97久久中文字幕无码| 人人狠狠综合久久亚洲| 日本精品久久久久影院日本 | 国产成人精品久久|