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

            那誰(shuí)的技術(shù)博客

            感興趣領(lǐng)域:高性能服務(wù)器編程,存儲(chǔ),算法,Linux內(nèi)核
            隨筆 - 210, 文章 - 0, 評(píng)論 - 1183, 引用 - 0
            數(shù)據(jù)加載中……

            <<算法導(dǎo)論>>一起學(xué)之一:我寫的一個(gè)Merge算法

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

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

                    }
                   
                }

            }


            // 書(shū)上的算法實(shí)現(xiàn)
            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;

                
            // 拷貝前半部分?jǐn)?shù)組
                for (int i = 0; i < n1; i++)
                
            {
                    temp1[i] 
            = array[start + i];
                }

                
            // 拷貝后半部分?jǐn)?shù)組
                for (int i = 0; i < n2; i++)
                
            {
                    temp2[i] 
            = array[mid + i + 1];
                }

                
            // 把后面的元素設(shè)置的很大
                temp1[n1] = temp2[n2] = 1000;
                
            // 逐個(gè)掃描兩部分?jǐn)?shù)組然后放到相應(yīng)的位置去
                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);
                }

            }

             

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

            posted on 2006-03-04 22:29 那誰(shuí) 閱讀(1489) 評(píng)論(2)  編輯 收藏 引用 所屬分類: 算法與數(shù)據(jù)結(jié)構(gòu)

            評(píng)論

            # re: >一起學(xué)之一:我寫的一個(gè)Merge算法  回復(fù)  更多評(píng)論   

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

            # re: >一起學(xué)之一:我寫的一個(gè)Merge算法  回復(fù)  更多評(píng)論   

            這個(gè)算法不需要輔助數(shù)組是一個(gè)原地排序。但是用了兩重循環(huán),復(fù)雜度為O(N^2),失去了歸并排序的本意。
            第二重循環(huán)是一個(gè)冒泡過(guò)程可改成折半插入,減少比較和元素移動(dòng)。以重循環(huán)可先用折半查找尋找前半部
            分第一個(gè)比array[mid+1]大的,但是這個(gè)算法仍然是O(N^2)的。原地的歸并排序如bartcher奇偶?xì)w并排序
            復(fù)雜度為O(N(logN)^2)可以看Robert Sedgewick的algorithm in c++,里面有實(shí)現(xiàn)。
            2006-04-21 11:33 | yangtou
            老男人久久青草av高清| 91秦先生久久久久久久| 久久久久久国产精品无码下载| 美女写真久久影院| 国产成人精品久久一区二区三区av | 99国产欧美精品久久久蜜芽 | 日本免费久久久久久久网站| 国产L精品国产亚洲区久久| 伊人久久大香线蕉综合5g| 久久精品蜜芽亚洲国产AV| 久久99精品久久久久久不卡| 无码久久精品国产亚洲Av影片| 99re久久精品国产首页2020| 热综合一本伊人久久精品| 亚洲∧v久久久无码精品| 久久本道久久综合伊人| 久久99精品久久久久久动态图 | 久久国产精品一区二区| 久久久久香蕉视频| 精品久久久无码人妻中文字幕豆芽| 国内精品久久久久久久久电影网| 亚洲精品乱码久久久久66| 精品久久综合1区2区3区激情| 久久99精品久久久久子伦| 久久精品无码一区二区WWW| 国产成人综合久久久久久| 精品免费tv久久久久久久| 国产A三级久久精品| 亚洲色欲久久久久综合网| 久久激情亚洲精品无码?V| 久久精品这里热有精品| 99久久精品国产高清一区二区| 色综合久久无码五十路人妻| 久久天天躁狠狠躁夜夜2020一| 久久精品国产99久久香蕉| 久久er国产精品免费观看2| 久久99国内精品自在现线| 日韩人妻无码精品久久久不卡| 午夜人妻久久久久久久久| 少妇精品久久久一区二区三区| 色综合久久中文字幕无码|