九大經典算法之歸并排序

07 歸并排序 (Merge Sort)

歸并操作的工作原理如下:
第一步:申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合并后的序列;
第二步:設定兩個指針,最初位置分別為兩個已經排序序列的起始位置;
第三步:比較兩個指針所指向的元素,選擇相對小的元素放入到合并空間,并移動指針到下一位置;
重復步驟3直到某一指針超出序列尾;
將另一序列剩下的所有元素直接復制到合并序列尾;
//循環實現
void
merge(int arr[], int l, int m, int r) { int i, j, k; int n1 = m - l + 1; int n2 = r - m; int L[n1], R[n2]; for (i = 0; i < n1; i++) L[i] = arr[l + i]; for (j = 0; j < n2; j++) R[j] = arr[m + 1+ j]; i = 0; j = 0; k = l; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else{ arr[k] = R[j]; j++; } k++; } while (i < n1) { arr[k] = L[i]; i++; k++; } while (j < n2) { arr[k] = R[j]; j++; k++; } } void merge_sort(int arr[], int l, int r) { if (l < r) { int m = l+(r-l)/2; mergeSort(arr, l, m); mergeSort(arr, m+1, r); merge(arr, l, m, r); } }
//遞歸實現
void merge(int arr[], int tmp[], int start, int end, int middle) {int l, r, s;s = start;l = start;r = middle + 1;while (l <= middle && r <= end) {if (arr[l] <= arr[r]) tmp[s++] = arr[l++];else tmp[s++] = arr[r++];}while (l <= middle) tmp[s++] = arr[l++];while (r <= end) tmp[s++] = arr[r++];for (;start <= end;start++)arr[start] = tmp[start];
}void msort(int arr[], int *tmp, int start, int end) {int middle;if (start < end) {middle = (start + end) / 2;msort(arr, tmp, start, middle);msort(arr, tmp, middle + 1, end);merge(arr, tmp, start, end, middle);}
}void merge_sort(int arr[], int n) {int *tmp = (int*)malloc(n*sizeof(int));msort(a, tmp, 0, n - 1);free(tmp);
} 

空間效率:O(n)

時間效率:最好情況:O(Nlog2N)? ?? ? ? ? ? ? ?平均情況:O(Nlog2N)? ?? ? ? ? ? ? ? ? ? ? ?最壞情況:O(Nlog2N)? ?

穩定性(相同元素相對位置變化情況):穩定

?

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

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

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

相關文章

長連接和Keepalive詳解

客戶端主機依舊活躍&#xff08;up&#xff09;運行&#xff0c;并且從服務器可到達。從客戶端TCP的正常響應&#xff0c;服務器知道對方仍然活躍。服務器的TCP為接下來的兩小時復位存活定時器&#xff0c;如果在這兩個小時到期之前&#xff0c;連接上發生應用程序的通信&#…

九大經典算法之基數排序、桶排序

08 基數排序&#xff08;Radix Sort&#xff09; 基數排序是一種非比較型整數排序算法&#xff0c;其原理是將整數按位數切割成不同的數字&#xff0c;然后按每個位數分別比較。排序過程是將所有待比較數值統一為同樣的數位長度&#xff0c;數位較短的數前面補零&#xff0c;然…

非阻塞connect

在 socket 是阻塞模式下 connect 函數會一直到有明確的結果才會返回&#xff08;或連接成功或連接失敗&#xff09;&#xff0c;如果服務器地址“較遠”&#xff0c;連接速度比較慢&#xff0c;connect 函數在連接過程中可能會導致程序阻塞在 connect 函數處好一會兒&#xff0…

1076 Wifi密碼 (15 分)

下面是微博上流傳的一張照片&#xff1a;“各位親愛的同學們&#xff0c;鑒于大家有時需要使用 wifi&#xff0c;又怕耽誤親們的學習&#xff0c;現將 wifi 密碼設置為下列數學題答案&#xff1a;A-1&#xff1b;B-2&#xff1b;C-3&#xff1b;D-4&#xff1b;請同學們自己作答…

和為S的連續正數序列

題目描述 小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。但是他并不滿足于此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,他就得到另一組連續正數和為100的序列:18,19,20,21,22。現在把問題交給你,你能不能…

1077 互評成績計算 (20 分)

在浙大的計算機專業課中&#xff0c;經常有互評分組報告這個環節。一個組上臺介紹自己的工作&#xff0c;其他組在臺下為其表現評分。最后這個組的互評成績是這樣計算的&#xff1a;所有其他組的評分中&#xff0c;去掉一個最高分和一個最低分&#xff0c;剩下的分數取平均分記…

1080 MOOC期終成績 (25 分)

對于在中國大學MOOC&#xff08;http://www.icourse163.org/ &#xff09;學習“數據結構”課程的學生&#xff0c;想要獲得一張合格證書&#xff0c;必須首先獲得不少于200分的在線編程作業分&#xff0c;然后總評獲得不少于60分&#xff08;滿分100&#xff09;。總評成績的計…

1078 字符串壓縮與解壓 (20 分)

文本壓縮有很多種方法&#xff0c;這里我們只考慮最簡單的一種&#xff1a;把由相同字符組成的一個連續的片段用這個字符和片段中含有這個字符的個數來表示。例如 ccccc 就用 5c 來表示。如果字符沒有重復&#xff0c;就原樣輸出。例如 aba 壓縮后仍然是 aba。 解壓方法就是反過…

120. 三角形最小路徑和

給定一個三角形&#xff0c;找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。 例如&#xff0c;給定三角形&#xff1a; [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自頂向下的最小路徑和為 11&#xff08;即&#xff0c;2 3 5 1 11&#xff09;…

1079 延遲的回文數 (20 分)

給定一個 k1 位的正整數 N&#xff0c;寫成 a?k???a?1??a?0?? 的形式&#xff0c;其中對所有 i 有 0≤a?i??<10 且 a?k??>0。N 被稱為一個回文數&#xff0c;當且僅當對所有 i 有 a?i??a?k?i??。零也被定義為一個回文數。 非回文數也可以通過一系…

1081 檢查密碼 (15 分)

本題要求你幫助某網站的用戶注冊模塊寫一個密碼合法性檢查的小功能。該網站要求用戶設置的密碼必須由不少于6個字符組成&#xff0c;并且只能有英文字母、數字和小數點 .&#xff0c;還必須既有字母也有數字。 輸入格式&#xff1a; 輸入第一行給出一個正整數 N&#xff08;≤ …

1082 射擊比賽 (20 分)

本題目給出的射擊比賽的規則非常簡單&#xff0c;誰打的彈洞距離靶心最近&#xff0c;誰就是冠軍&#xff1b;誰差得最遠&#xff0c;誰就是菜鳥。本題給出一系列彈洞的平面坐標(x,y)&#xff0c;請你編寫程序找出冠軍和菜鳥。我們假設靶心在原點(0,0)。 輸入格式&#xff1a; …

LRU緩存機制

運用你所掌握的數據結構&#xff0c;設計和實現一個 LRU (最近最少使用) 緩存機制。它應該支持以下操作&#xff1a; 獲取數據 get 和 寫入數據 put 。 獲取數據 get(key) - 如果密鑰 (key) 存在于緩存中&#xff0c;則獲取密鑰的值&#xff08;總是正數&#xff09;&#xff…

1083 是否存在相等的差 (20 分)

給定 N 張卡片&#xff0c;正面分別寫上 1、2、……、N&#xff0c;然后全部翻面&#xff0c;洗牌&#xff0c;在背面分別寫上 1、2、……、N。將每張牌的正反兩面數字相減&#xff08;大減小&#xff09;&#xff0c;得到 N 個非負差值&#xff0c;其中是否存在相等的差&#…

c++如何防止一個類被其他類繼承?

如何在防止一個類被其他的類繼承呢&#xff1f; 如果是僅僅為了達到這個目的可以直接把這個類的構造函數設置成私有的&#xff0c;這樣就杜絕了其他類的繼承。也相當于毀掉了這個類&#xff08;無法再創造出自己的對象&#xff09;。 那么怎么樣既要保證這個類的完整性&#…

1084 外觀數列 (20 分)

外觀數列是指具有以下特點的整數序列&#xff1a; d, d1, d111, d113, d11231, d112213111, ...它從不等于 1 的數字 d 開始&#xff0c;序列的第 n1 項是對第 n 項的描述。比如第 2 項表示第 1 項有 1 個 d&#xff0c;所以就是 d1&#xff1b;第 2 項是 1 個 d&#xff08;對…

C++中構造函數和析構函數可以拋出異常嗎?

不建議在構造函數中拋出異常。當構造函數中拋出異常時&#xff0c;析構函數將不會被執行&#xff0c;需要手動釋放內存。析構函數不應該拋出異常。當析構函數中有一些可能發生的異常時&#xff0c;這時候要把可能發生的異常完全封裝在析構函數內部&#xff0c;決不能讓它拋出到…

1085 PAT單位排行 (25 分

每次 PAT 考試結束后&#xff0c;考試中心都會發布一個考生單位排行榜。本題就請你實現這個功能。 輸入格式&#xff1a; 輸入第一行給出一個正整數 N&#xff08;≤&#xff09;&#xff0c;即考生人數。隨后 N 行&#xff0c;每行按下列格式給出一個考生的信息&#xff1a; 準…

23. 合并K個排序鏈表

合并 k 個排序鏈表&#xff0c;返回合并后的排序鏈表。請分析和描述算法的復雜度。 示例: 輸入: [ 1->4->5, 1->3->4, 2->6 ] 輸出: 1->1->2->3->4->4->5->6 解法&#xff1a; class Solution { public:ListNode* mergeKLists(vect…

1086 就不告訴你 (15 分)

做作業的時候&#xff0c;鄰座的小盆友問你&#xff1a;“五乘以七等于多少&#xff1f;”你應該不失禮貌地圍笑著告訴他&#xff1a;“五十三。”本題就要求你&#xff0c;對任何一對給定的正整數&#xff0c;倒著輸出它們的乘積。 輸入格式&#xff1a; 輸入在第一行給出兩個…