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

            那誰的技術(shù)博客

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

            [算法問題]交換兩個子數(shù)組的元素值

            問題描述:
            ?設(shè)a[0:n-1]是一個有n個元素的數(shù)組,k(0<=k<=n-1)是一個非負(fù)整數(shù).試設(shè)計一個算法將子數(shù)組
            a[0:k]與a[k+1:n-1]換位.要求算法在最壞情況下耗時O(n), 且只用到O(1)的輔助空間.

            這個問題比較常見了,一般的辦法就是分別把兩個子數(shù)組分別逆序排列,然后對整個數(shù)組進(jìn)行逆序排列.也就是說,對一個數(shù)組
            a[8] = {1,2,3,4,5}而言,如果k = 2,那么首先對兩個子數(shù)組進(jìn)行逆序操作得序列{3, 2,1,5,4},然后對整個數(shù)組逆序排列得到{4,5,1,2,3}.

            下面給出的是另一種辦法,采用的是遞歸方法,結(jié)合前面的例子講述一下思想,在例子中前面的元素數(shù)量大于后面的元素數(shù)量(前面是3個,后面是兩個),那么先以含有比較少的元素子數(shù)組的數(shù)量為標(biāo)準(zhǔn)進(jìn)行交換,得到序列:{4,5,3,2,1},中間多出來的3沒有參與到這次交換之中,這個時候含有比較少的元素的子數(shù)組{4,5}已經(jīng)被交換到了最后合適的位置,后面的操作可以不必考慮它們了.對剩余子數(shù)組的操作顯然和原來的問題有類似的行為,我們要做的是交換序列{3}和序列{2,1}的位置,因此這是一個遞歸可以解決的問題.

            應(yīng)該說,兩種算法各有千秋吧.前一種辦法最壞的時候每個元素都要移動兩次才能到達(dá)最后合適的位置,但是第二種辦法在兩個數(shù)組元素數(shù)量相同的時候只需要移動一次元素就可以到達(dá)合適的位置了.
            當(dāng)然了,這個辦法不如前一個方法那么"聰明",要寫正確也不是很容易,但是可以作為分治法或者是遞歸法解決問題的一個實例.


            #include?<stdio.h>

            void?DisplayArray(int?*pArray,?int?nLen)
            {
            ????
            for?(int?i?=?0;?i?<?nLen;?++i)
            ????
            {
            ????????printf(
            "array[%d]?=?%d\n",?i,?pArray[i]);
            ????}

            }


            void?SwapSubArray(int?*pArray1,?int?*pArray2,?int?n)
            {
            ????
            int?temp;
            ????
            for?(int?i?=?0;?i?<?n;?++i)
            ????
            {
            ????????temp?
            =?*(pArray1?+?i);
            ????????
            *(pArray1?+?i)?=?*(pArray2?+?i);
            ????????
            *(pArray2?+?i)?=?temp;
            ????}

            }


            void?ChangeArray(int?*pArray,?int?nLen,?int?k)
            {
            ????
            if?(NULL?==?pArray)
            ????????
            return;
            ????
            if?(k?<?0?||?k?>?nLen?-?1)
            ????????
            return;

            ????
            int?m,?n,?num;
            ????
            if?(nLen?-?k?-?1?>?k?+?1)????????????????????????????????????//?如果后半部分的元素多
            ????{
            ????????m?
            =?nLen?-?k?-?1?-?k?-?1;????????????????????????????????//?m是兩部分元素數(shù)量之差
            ????????SwapSubArray(pArray,?pArray?+?k?+?1?+?m,?k?+?1);????????//?交換兩部分元素數(shù)目相同的部分
            ????????ChangeArray(pArray,?nLen?-?k?-?1,?k);
            ????}

            ????
            else?if?(nLen?-?k?-?1?<?k?+?1)????????????????????????????????//?如果前半部分的元素多
            ????{
            ????????m?
            =?k?+?1?-?nLen?+?k?+?1;
            ????????SwapSubArray(pArray,?pArray?
            +?k?+?1,?k?+?1?-?m);????????//?交換兩部分元素數(shù)目相同的部分
            ????????ChangeArray(pArray?+?nLen?-?k?-?1,?k?+?1,?m?-?1);
            ????}

            ????
            else????????????????????????????????????????????????????????//?前后兩部分元素數(shù)量相同
            ????{
            ????????SwapSubArray(pArray,?pArray?
            +?k?+?1,?k?+?1);
            ????}

            }


            int?main()
            {
            ????
            int?array[]?=?{0,?1,?2,?3,?4,?5,?6,?7};
            ????
            int?nLen?=?sizeof(array)?/?sizeof(array[0]);
            ????DisplayArray(array,?nLen);

            ????ChangeArray(array,?nLen,?
            1);
            ????printf(
            "after?change:\n");
            ????DisplayArray(array,?nLen);

            ????
            return?1;
            }


            posted on 2006-09-26 23:21 那誰 閱讀(1782) 評論(1)  編輯 收藏 引用 所屬分類: 算法與數(shù)據(jù)結(jié)構(gòu)

            評論

            # re: [算法問題]交換兩個子數(shù)組的元素值  回復(fù)  更多評論   

            遞歸方法堆棧的開銷是題目要求的O(1)嗎?
            2006-09-27 21:05 | elife
            久久播电影网| 亚洲va久久久噜噜噜久久狠狠| 久久精品免费全国观看国产| 99久久精品免费国产大片| 久久人人爽爽爽人久久久| 久久婷婷是五月综合色狠狠| 久久亚洲精品无码观看不卡| 精品无码久久久久久久动漫| 亚洲欧美日韩精品久久| 亚洲欧美精品伊人久久| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 一级女性全黄久久生活片免费 | 精品久久久久久无码中文字幕一区| 欧美精品国产综合久久| 亚洲国产精品无码久久| 欧美一区二区三区久久综合 | 久久久一本精品99久久精品66| 久久夜色精品国产亚洲| 精品伊人久久大线蕉色首页| 久久精品人人做人人爽电影蜜月| 国产产无码乱码精品久久鸭| 香蕉久久夜色精品国产小说| 亚洲午夜福利精品久久| 久久亚洲美女精品国产精品| 国产Av激情久久无码天堂| 999久久久国产精品| 97视频久久久| 久久A级毛片免费观看| 狠狠精品干练久久久无码中文字幕 | 日韩电影久久久被窝网| 日产精品久久久久久久| 亚洲国产精品婷婷久久| 无码人妻少妇久久中文字幕| 久久精品国产亚洲AV忘忧草18| 国产精品久久99| 亚洲精品第一综合99久久| 99久久婷婷国产综合亚洲| 无码人妻少妇久久中文字幕 | 亚洲国产婷婷香蕉久久久久久| 久久久免费精品re6| 久久久久久噜噜精品免费直播|