• <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
            這兩天比較閑,復習了一下算法中的基本排序算法。
            挑選了3種比較經典的排序算法進行了實現并測試。
            1.   基數排序
            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所以導致效率有一定降低,而且使用的16個桶占用了很多額外的空間。
            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)如果當數組小于一定規模(10-20)采用插入排序,可以減少一定的時間
            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)


            測試:在2.7G*2 CPU,3.4G內存的pc上,隨機生成的1億個最大值為2的31次的整數作為測試用例。
            測試方法:
            #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");
            }
            測試結果:()中為快速排序+插入排序的時間
                 
            基數排序 快速排序 堆排序
            time 45093ms 14797ms(13625ms) 77047ms
            按理論堆排序和快速排序應該差不多,不明原因。
              
            posted on 2012-06-28 18:02 saha 閱讀(436) 評論(1)  編輯 收藏 引用

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

            <2012年9月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            30123456

            常用鏈接

            留言簿

            文章分類

            文章檔案

            收藏夾

            搜索

            •  

            最新評論

            久久精品中文騷妇女内射| 亚洲成色999久久网站| 色婷婷综合久久久久中文| 亚洲国产另类久久久精品小说| 精品久久人人做人人爽综合| 亚洲欧美成人综合久久久| 色综合久久无码中文字幕| 日产精品久久久一区二区| 国产精品一区二区久久精品无码| 日本久久久久久久久久| 久久w5ww成w人免费| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 久久福利青草精品资源站| 久久人人爽人人爽人人AV | 亚洲第一永久AV网站久久精品男人的天堂AV | 久久久WWW免费人成精品| 久久99精品久久久久久齐齐 | 无遮挡粉嫩小泬久久久久久久| 中文字幕精品无码久久久久久3D日动漫 | 亚洲一区精品伊人久久伊人 | 精品精品国产自在久久高清| 久久99国产精品久久99果冻传媒| 97久久久久人妻精品专区| 久久这里只有精品首页| 99久久精品费精品国产| 久久亚洲国产成人影院网站 | 久久电影网一区| 热RE99久久精品国产66热| 亚洲欧洲久久av| 久久国产亚洲精品无码| segui久久国产精品| 四虎影视久久久免费观看| 午夜精品久久久久久久久| 99久久亚洲综合精品成人| 超级碰碰碰碰97久久久久| 九九久久自然熟的香蕉图片| 久久露脸国产精品| 国产精品久久波多野结衣| 欧美粉嫩小泬久久久久久久 | 久久久国产精品福利免费| 日韩亚洲国产综合久久久|