1035 插入與歸并 (25 分)

根據維基百科的定義:

插入排序是迭代算法,逐一獲得輸入數據,逐步產生有序的輸出序列。每步迭代中,算法從輸入序列中取出一元素,將之插入有序序列中正確的位置。如此迭代直到全部元素有序。

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

現給定原始序列和由某排序算法產生的中間序列,請你判斷該算法究竟是哪種排序算法?

輸入格式:

輸入在第一行給出正整數 N (≤100);隨后一行給出原始序列的 N 個整數;最后一行給出由某排序算法產生的中間序列。這里假設排序的目標序列是升序。數字間以空格分隔。

輸出格式:

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

輸入樣例 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
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 110;
int origin[maxn],tempOri[maxn],changed[maxn];void showArray(int A[],int n){for(int i = 0; i < n;i++){printf("%d",A[i]);if(i < n - 1) printf(" ");}
}bool isSame(int A[],int B[],int n){for(int i = 0; i < n; i++){if(A[i] != B[i]) return false;}return true;
}bool InsertionSort(int n){bool flag = false;for(int i = 1; i < n; i++){if(i != 1 && isSame(tempOri,changed,n)){flag = true;}int temp = tempOri[i], j = i;while(j > 0 && tempOri[j - 1] > temp){tempOri[j] = tempOri[j - 1];j--;}tempOri[j] = temp;if(flag == true) return true;}return false;
}void MergeSort(int n){bool flag = false;for(int step = 2; step/2 <= n; step *= 2){if(step != 2 && isSame(tempOri,changed,n)){flag = true;}for(int i = 0; i < n; i += step){sort(tempOri+i,tempOri+min(n,i+step));}if(flag == true){showArray(tempOri,n);return;}}
}int main(){int n;scanf("%d",&n);for(int i = 0 ; i < n; i++){scanf("%d",&origin[i]);tempOri[i] = origin[i];}for(int i = 0; i < n; i++){scanf("%d",&changed[i]);}if(InsertionSort(n)){printf("Insertion Sort\n");showArray(tempOri,n);}else{printf("Merge Sort\n");for(int i = 0 ; i < n; i++){tempOri[i] = origin[i];}MergeSort(n);}return 0;
}
//12分
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 110;
int origin[maxn],tempOri[maxn],changed[maxn];
int n;void showArray(int A[]){for(int i = 0 ; i < n; i++){printf("%d",A[i]);if(i < n - 1) printf(" "); }
}bool isSame(int A[],int B[]){for(int i = 0; i < n; i++){if(A[i] != B[i]) return false;}return true;
}bool InsertionSort(){bool flag = false;for(int i = 1; i < n; i++){if(i != 1 && isSame(tempOri,changed))flag = true;int temp = tempOri[i], j = i;while(j > 0 && tempOri[j - 1] > temp) {tempOri[j] = tempOri[j - 1];j--;}tempOri[j] = temp;if(flag == true) return true;}return false;
}void MergeSort(){bool flag = false;for(int step = 2; step/2 <= n; step *= 2){if(step != 2 && isSame(tempOri,changed))flag = true;for(int i = 0; i < n; i += step){sort(tempOri+i,tempOri+min(n,i+step));if(flag == true){               showArray(tempOri);return;}}}
}int main(){scanf("%d",&n);for(int i = 0; i < n; i++){scanf("%d",&origin[i]);tempOri[i] = origin[i];}for(int i = 0; i < n; i++){scanf("%d",&changed[i]);}if(InsertionSort()){printf("Insertion Sort\n");showArray(tempOri);}else{printf("Merge Sort\n");for(int i = 0 ; i < n; i++){tempOri[i] = origin[i];}MergeSort();}return 0;
}

?

轉載于:https://www.cnblogs.com/wanghao-boke/p/10294132.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385223.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385223.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385223.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

迭代式失效情況

vector 向容器插入元素后&#xff1a; 如果容器是vector或string&#xff0c;且存儲空間被重新分配&#xff0c;則指向容器的迭代器會失效&#xff1b;如果存儲空間未重新分配&#xff0c;指向插入點位置號之前的元素的迭代器仍然有效&#xff0c;但是指向插入點之后的元素的迭…

1039 到底買不買 (20 分)

小紅想買些珠子做一串自己喜歡的珠串。賣珠子的攤主有很多串五顏六色的珠串&#xff0c;但是不肯把任何一串拆散了賣。于是小紅要你幫忙判斷一下&#xff0c;某串珠子里是否包含了全部自己想要的珠子&#xff1f;如果是&#xff0c;那么告訴她有多少多余的珠子&#xff1b;如果…

【Leetcode】111. 二叉樹的最小深度

給定一個二叉樹&#xff0c;找出其最小深度。 最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定二叉樹 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它的最小深度 2. 解題思路&#xff1a;…

1040 有幾個PAT (25 分

字符串 APPAPT 中包含了兩個單詞 PAT&#xff0c;其中第一個 PAT 是第 2 位(P)&#xff0c;第 4 位(A)&#xff0c;第 6 位(T)&#xff1b;第二個 PAT 是第 3 位(P)&#xff0c;第 4 位(A)&#xff0c;第 6 位(T)。 現給定字符串&#xff0c;問一共可以形成多少個 PAT&#xff…

g

1. 何時需要成員初始化列表&#xff1f;過程是什么&#xff1f; 當初始化一個引用成員變量時&#xff1b;初始化一個const成員變量時&#xff1b;當調用一個基類的構造函數&#xff0c;而構造函數擁有一組參數時&#xff1b;當調用一個成員類的構造函數&#xff0c;而他擁有一組…

【Leetcode | 1】93. 復原IP地址

給定一個只包含數字的字符串&#xff0c;復原它并返回所有可能的 IP 地址格式。 示例: 輸入: "25525511135" 輸出: ["255.255.11.135", "255.255.111.35"] 方法一&#xff1a; class Solution { public:vector<string> restoreIpAddresse…

1051 復數乘法 (15 分)

復數可以寫成 ( 的常規形式&#xff0c;其中 A 是實部&#xff0c;B 是虛部&#xff0c;i 是虛數單位&#xff0c;滿足 1&#xff1b;也可以寫成極坐標下的指數形式 (&#xff0c;其中 R 是復數模&#xff0c;P 是輻角&#xff0c;i 是虛數單位&#xff0c;其等價于三角形式 (。…

【Leetcode | 13】56. 合并區間

給出一個區間的集合&#xff0c;請合并所有重疊的區間。 示例 1: 輸入: [[1,3],[2,6],[8,10],[15,18]] 輸出: [[1,6],[8,10],[15,18]] 解釋: 區間 [1,3] 和 [2,6] 重疊, 將它們合并為 [1,6]. 示例 2: 輸入: [[1,4],[4,5]] 輸出: [[1,5]] 解釋: 區間 [1,4] 和 [4,5] 可被視為重疊…

1050 螺旋矩陣 (25 分

本題要求將給定的 N 個正整數按非遞增的順序&#xff0c;填入“螺旋矩陣”。所謂“螺旋矩陣”&#xff0c;是指從左上角第 1 個格子開始&#xff0c;按順時針螺旋方向填充。要求矩陣的規模為 m 行 n 列&#xff0c;滿足條件&#xff1a;mn 等于 N&#xff1b;m≥n&#xff1b;且…

【Leetcode | 11】268. 缺失數字

給定一個包含 0, 1, 2, ..., n 中 n 個數的序列&#xff0c;找出 0 .. n 中沒有出現在序列中的那個數。 示例 1: 輸入: [3,0,1] 輸出: 2 示例 2: 輸入: [9,6,4,2,3,5,7,0,1] 輸出: 8 說明: 你的算法應具有線性時間復雜度。你能否僅使用額外常數空間來實現? class Solution { p…

1053 住房空置率 (20 分)

在不打擾居民的前提下&#xff0c;統計住房空置率的一種方法是根據每戶用電量的連續變化規律進行判斷。判斷方法如下&#xff1a; 在觀察期內&#xff0c;若存在超過一半的日子用電量低于某給定的閾值 e&#xff0c;則該住房為“可能空置”&#xff1b; 若觀察期超過某給定閾值…

1052 賣個萌 (20 分)

萌萌噠表情符號通常由“手”、“眼”、“口”三個主要部分組成。簡單起見&#xff0c;我們假設一個表情符號是按下列格式輸出的&#xff1a; [左手]([左眼][口][右眼])[右手]現給出可選用的符號集合&#xff0c;請你按用戶的要求輸出表情。 輸入格式&#xff1a; 輸入首先在前三…

1054 求平均值 (20 分)

1054 求平均值 &#xff08;20 分&#xff09;本題的基本要求非常簡單&#xff1a;給定 N 個實數&#xff0c;計算它們的平均值。但復雜的是有些輸入數據可能是非法的。一個“合法”的輸入是 [?1000,1000] 區間內的實數&#xff0c;并且最多精確到小數點后 2 位。當你計算平均…

【Leetcode | 12】342. 4的冪

給定一個整數 (32 位有符號整數)&#xff0c;請編寫一個函數來判斷它是否是 4 的冪次方。 示例 1: 輸入: 16 輸出: true 示例 2: 輸入: 5 輸出: false 方法一&#xff1a; class Solution { public:bool isPowerOfFour(int num) {// 0x55555555 二進制 1010101010101010101010…

1056 組合數的和 (15 分)

給定 N 個非 0 的個位數字&#xff0c;用其中任意 2 個數字都可以組合成 1 個 2 位的數字。要求所有可能組合出來的 2 位數字的和。例如給定 2、5、8&#xff0c;則可以組合出&#xff1a;25、28、52、58、82、85&#xff0c;它們的和為330。 輸入格式&#xff1a; 輸入在第一行…

【Leetcode | 42】129. 求根到葉子節點數字之和

給定一個二叉樹&#xff0c;它的每個結點都存放一個 0-9 的數字&#xff0c;每條從根到葉子節點的路徑都代表一個數字。 例如&#xff0c;從根到葉子節點路徑 1->2->3 代表數字 123。 計算從根到葉子節點生成的所有數字之和。 說明: 葉子節點是指沒有子節點的節點。 示例…

1057 數零壹 (20 分)

給定一串長度不超過 10?5?? 的字符串&#xff0c;本題要求你將其中所有英文字母的序號&#xff08;字母 a-z 對應序號 1-26&#xff0c;不分大小寫&#xff09;相加&#xff0c;得到整數 N&#xff0c;然后再分析一下 N 的二進制表示中有多少 0、多少 1。例如給定字符串 PAT…

145. 二叉樹的后序遍歷

給定一個二叉樹&#xff0c;返回它的 后序 遍歷。 示例: 輸入: [1,null,2,3] 1 \ 2 / 3 輸出: [3,2,1] 進階: 遞歸算法很簡單&#xff0c;你可以通過迭代算法完成嗎&#xff1f; 來源&#xff1a;力扣&#xff08;LeetCode&#xff09; 鏈接&#xff1a;…

1055 集體照 (25 分)

拍集體照時隊形很重要&#xff0c;這里對給定的 N 個人 K 排的隊形設計排隊規則如下&#xff1a; 每排人數為 /&#xff08;向下取整&#xff09;&#xff0c;多出來的人全部站在最后一排&#xff1b; 后排所有人的個子都不比前排任何人矮&#xff1b; 每排中最高者站中間&am…