PAT Basic 1035. 插入與歸并(25)(C語言實(shí)現(xiàn))

我的PAT系列文章更新重心已移至Github蚯妇,歡迎來看PAT題解的小伙伴請到Github Pages瀏覽最新內(nèi)容是趴。此處文章目前已更新至與Github Pages同步涛舍。歡迎star我的repo

題目

根據(jù)維基百科的定義:

插入排序
是迭代算法唆途,逐一獲得輸入數(shù)據(jù)富雅,逐步產(chǎn)生有序的輸出序列。每步迭代中肛搬,算法從輸入序列中取出一元素没佑,將之插入有序序列中正確的位置。如此迭代直到全部元素有序温赔。

歸并排序 進(jìn)行如下迭代操作:首先將原始序列看成 N 個(gè)只包含 1 個(gè)元素的有序子序列蛤奢,然后每次迭代歸并兩個(gè)相鄰的有序子序列,直到最后只剩下 1
個(gè)有序的序列陶贼。

現(xiàn)給定原始序列和由某排序算法產(chǎn)生的中間序列啤贩,請你判斷該算法究竟是哪種排序算法?

輸入格式:

輸入在第一行給出正整數(shù) N ( \le 100)拜秧;隨后一行給出原始序列的 N
個(gè)整數(shù)痹屹;最后一行給出由某排序算法產(chǎn)生的中間序列。這里假設(shè)排序的目標(biāo)序列是升序枉氮。數(shù)字間以空格分隔痢掠。

輸出格式:

首先在第 1 行中輸出Insertion Sort表示插入排序、或Merge Sort表示歸并排序嘲恍;然后在第 2
行中輸出用該排序算法再迭代一輪的結(jié)果序列足画。題目保證每組測試的結(jié)果是唯一的。數(shù)字間以空格分隔佃牛,且行首尾不得有多余空格淹辞。

輸入樣例 1:

10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0

輸出樣例 1:

Insertion Sort
1 2 3 5 7 8 9 4 6 0

輸入樣例 2:

10
3 1 2 8 7 5 9 4 0 6
1 3 2 8 5 7 4 9 0 6

輸出樣例 2:

Merge Sort
1 2 3 8 4 5 7 9 0 6

思路

這道題是我唯一看了幾乎網(wǎng)上所有熱門博客都沒有發(fā)現(xiàn)自己錯(cuò)在哪的一道題,提交了10遍啊~差點(diǎn)絕望俘侠。最后乖乖地按照普遍做法改寫了代碼象缀,終于過了。

題中說

題目保證每組測試的結(jié)果是唯一的爷速。

這應(yīng)該有兩點(diǎn)保證:

  • 一定能區(qū)分插入排序和歸并排序
  • 一定能確定排序的步數(shù)央星,不會(huì)產(chǎn)生某一步排序沒有任何改變的情況

判斷哪種排序方法

  • 插入排序:
    從后向前找到和原始數(shù)組不同的元素,驗(yàn)證此元素之前是否為排好序的惫东,如果是排好的莉给,則是插入排序毙石,下一步將第一個(gè)相同的元素插入排序
  • 歸并排序:
    從最初的數(shù)組模擬一步一步的歸并,直至和中間序列相同颓遏,再向下進(jìn)行一步

代碼

最新代碼@github徐矩,歡迎交流

#include <stdio.h>
#include <stdlib.h>

int comp(const void *a, const void *b)
{
    return *(int*)a - *(int*)b;
}

int main()
{
    int N, origin[100], halfsort[100], i, j, length;
    scanf("%d", &N);
    for(int i = 0; i < N; i++) scanf("%d", origin + i);
    for(int i = 0; i < N; i++) scanf("%d", halfsort + i);

    /* if it is insertion sort, return sorted length if yes, zero otherwise */
    for(i = 0; i < N - 1 && halfsort[i] <= halfsort[i + 1]; i++) ;
    for(length = ++i; i < N && halfsort[i] == origin[i]; i++) ;
    length = i == N ? length + 1 : 0;

    if(length)                  /* insertion sort */
    {
        puts("Insertion Sort");
        qsort(origin, length, sizeof(int), comp);
    }
    else                        /* merge sort, operate on the original array */
    {
        puts("Merge Sort");
        for(length = 1, i = 0; i < N && length <= N; length *= 2)
        {
            /* i == N means identical, also breaks the outer 'for' loop */
            for(i = 0; i < N && origin[i] == halfsort[i]; i++) ;
            for(j = 0; j < N / length; j++)
                qsort(origin + j * length, length, sizeof(int), comp);
            qsort(origin + j * length, N % length, sizeof(int), comp);
        }
    }

    for(int i = 0; i < N; i++)
        printf("%d%c", origin[i], i == N - 1 ? '\n' : ' ');

    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市叁幢,隨后出現(xiàn)的幾起案子滤灯,更是在濱河造成了極大的恐慌,老刑警劉巖曼玩,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳞骤,死亡現(xiàn)場離奇詭異,居然都是意外死亡黍判,警方通過查閱死者的電腦和手機(jī)弟孟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來样悟,“玉大人,你說我怎么就攤上這事庭猩】咚” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵蔼水,是天一觀的道長震糖。 經(jīng)常有香客問我,道長趴腋,這世上最難降的妖魔是什么吊说? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮优炬,結(jié)果婚禮上颁井,老公的妹妹穿的比我還像新娘。我一直安慰自己蠢护,他們只是感情好雅宾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著葵硕,像睡著了一般眉抬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上懈凹,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天蜀变,我揣著相機(jī)與錄音,去河邊找鬼介评。 笑死库北,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贤惯,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼洼专,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了孵构?” 一聲冷哼從身側(cè)響起屁商,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颈墅,沒想到半個(gè)月后蜡镶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恤筛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年官还,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毒坛。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡望伦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出煎殷,到底是詐尸還是另有隱情屯伞,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布豪直,位于F島的核電站劣摇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏弓乙。R本人自食惡果不足惜末融,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望暇韧。 院中可真熱鬧勾习,春花似錦、人聲如沸懈玻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酪刀。三九已至粹舵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骂倘,已是汗流浹背眼滤。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留历涝,地道東北人诅需。 一個(gè)月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓漾唉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親堰塌。 傳聞我的和親對象是個(gè)殘疾皇子赵刑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容