• <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>

            那誰的技術博客

            感興趣領域:高性能服務器編程,存儲,算法,Linux內核
            隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
            數據加載中……

            <<算法導論>>一起學之一:我寫的一個Merge算法

                   第二章中給出的Merge算法,本質是初始化兩個數組分別保存前后兩個已經排序好了的數組,然后逐個掃描比較兩個數組中的元素把元素放在原來數組的合適的位置上.
                   不知道之前有沒有人做過這個算法,比起書上的那個并不見得高明,在最壞的情況下要交換元素(N/2)*(N/2)也就是N的平方數量級(這里N是數組的大小),這個最壞的情況就是前面的數組中的元素都比后面數組的元素大.
                   雖然不見得是最好的,不過至少是自己思考的結果,放上來也許對別人有啟發.
                  
            // 如何證明算法的正確性?
            // 我改進的merge算法
            void Merge1(int array[], int start, int mid, int end)
            {
                
            // 思想:設置兩個哨兵,分別指向前后兩個數組,
                
            // 逐個把前面的數組的元素和后面數組的元素進行比較
                
            // 如果前面的元素不比后面的元素大,那么前面數組的哨兵前移一位
                
            // 否則,交換兩個元素,并且對后面的數組進行掃描,確保新的元素放在合適的位置
                
            // 當前面的數組掃描完畢之后循環結束
                for (int i = start; i < mid + 1++i)
                
            {
                    
            if (array[i] > array[mid + 1])
                    
            {
                        swap(
            &array[i], &array[mid + 1]);

                        
            // 把新放入后面數組的元素放到合適的位置去
                        for (int j = mid +1; j + 1 <= end && array[j] > array[j + 1]; ++j)
                        
            {
                            swap(
            &array[j], &array[j + 1]);
                        }

                    }
                   
                }

            }


            // 書上的算法實現
            void Merge(int array[], int start, int mid, int end)
            {
                
            int temp1[10], temp2[10];
                
            int n1, n2;
                n1 
            = mid - start + 1;
                n2 
            = end - mid;

                
            // 拷貝前半部分數組
                for (int i = 0; i < n1; i++)
                
            {
                    temp1[i] 
            = array[start + i];
                }

                
            // 拷貝后半部分數組
                for (int i = 0; i < n2; i++)
                
            {
                    temp2[i] 
            = array[mid + i + 1];
                }

                
            // 把后面的元素設置的很大
                temp1[n1] = temp2[n2] = 1000;
                
            // 逐個掃描兩部分數組然后放到相應的位置去
                for (int k = start, i = 0, j = 0; k <= end; k++)
                
            {
                    
            if (temp1[i] <= temp2[j])
                    
            {
                        array[k] 
            = temp1[i];
                        i
            ++;
                    }

                    
            else
                    
            {
                        array[k] 
            = temp2[j];
                        j
            ++;
                    }

                }

            }


            void Merge_Sort(int array[], int start, int end)
            {
                
            if (start < end)
                
            {
                    
            int i;
                    i 
            = (end + start) / 2;
                    Merge_Sort(array, start, i);
                    Merge_Sort(array, i 
            + 1, end);

                    Merge1(array, start, i, end);
                }

            }

             

                  對外的接口:Merge_Sort(array, start, end);
            即:傳入一個數組,和起始位置中止位置,比如數組array[10],那么就是Merge_Sort(arrry,0,9)

            posted on 2006-03-04 22:29 那誰 閱讀(1479) 評論(2)  編輯 收藏 引用 所屬分類: 算法與數據結構

            評論

            # re: >一起學之一:我寫的一個Merge算法  回復  更多評論   

            這個 blog 好,代碼還可以伸縮啊。回頭得給 fan 老大提提意見了。
            2006-03-07 15:13 | win_hate

            # re: >一起學之一:我寫的一個Merge算法  回復  更多評論   

            這個算法不需要輔助數組是一個原地排序。但是用了兩重循環,復雜度為O(N^2),失去了歸并排序的本意。
            第二重循環是一個冒泡過程可改成折半插入,減少比較和元素移動。以重循環可先用折半查找尋找前半部
            分第一個比array[mid+1]大的,但是這個算法仍然是O(N^2)的。原地的歸并排序如bartcher奇偶歸并排序
            復雜度為O(N(logN)^2)可以看Robert Sedgewick的algorithm in c++,里面有實現。
            2006-04-21 11:33 | yangtou
            日本免费一区二区久久人人澡| 久久精品国产亚洲Aⅴ蜜臀色欲| 国内精品久久久久影院薰衣草 | 奇米综合四色77777久久| 久久久久人妻一区精品性色av| 91久久精一区二区三区大全| 99久久精品免费看国产免费| 女人高潮久久久叫人喷水| 国产精品一区二区久久精品| 亚洲国产成人精品91久久久| 久久久精品国产sm调教网站 | 久久婷婷五月综合色高清| 婷婷久久综合九色综合98| 久久久亚洲欧洲日产国码是AV| 999久久久免费精品国产| 综合久久一区二区三区 | 亚洲伊人久久成综合人影院 | 亚洲欧洲中文日韩久久AV乱码| 久久精品国产亚洲沈樵| 精品久久亚洲中文无码| 人人狠狠综合久久亚洲| 久久九九亚洲精品| 久久久久亚洲AV无码网站| 久久夜色精品国产亚洲| 香港aa三级久久三级老师2021国产三级精品三级在 | 狠狠色丁香婷婷久久综合| 国产精品青草久久久久福利99| 久久久久99精品成人片试看| 久久精品视频一| 无码精品久久一区二区三区 | 婷婷久久综合九色综合98| 人妻精品久久无码专区精东影业 | 三上悠亚久久精品| 伊人久久综合成人网| 欧美激情一区二区久久久| 久久影院午夜理论片无码| 国产一区二区三精品久久久无广告 | 久久精品成人欧美大片| 91精品国产色综久久| 国产免费福利体检区久久| 99久久国产综合精品网成人影院|