在合併鍊錶的題目中,有乙個典型的題目:合併有序鍊錶
這道題的解法有很多,比較典型的解法是:分治法。
這道題的題幹已經給出了重要的資訊:每乙個鍊錶的區域性是有序的。那麼,解決這道題時就可以利用這個特點,不用將每乙個元素逐個比較,可以將鍊錶兩兩排序合併。
鍊錶兩兩排序合併有什麼好處?
鍊錶兩兩排序可以降低比較的次數。在合併的過程中,當乙個鍊錶已經檢索到尾部,那麼另乙個鍊錶直接尾插就完成了合併。(這裡可以對比其他的排序方法:氣泡排序/插入排序.這兩種排序有乙個特點:尋找最值,如果在這個題上實行,就不能很好利用內部有序的特點)
實現思路:兩兩排序,遞迴實現。 使用遞迴大大的減少了**量。而這個問題的引數時鍊錶,也就忽略了遞迴帶來的空間浪費,所有的操作都在原煉表上實現的。
實現**:
class solution
private void merge(int arr, int low, int mid, int high)
else
}while(i
while(j
for(min=0;min
}
歸併排序(分治)
把乙個陣列 a 分成兩個部分 s,m m 1,e 假設兩部分分別有序,把這兩部分合併到另一陣列中 tmp 保證該陣列有序,然後再把資料 e s 1拷貝回陣列a 分治的原理。把資料無限二分,最後比較兩個數即可。遞迴實現。includeusing namespace std int a 10 int b...
歸併排序 分治
歸併 將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有 序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。歸併的本質 空間換時間,通過申請乙個額外陣列儲存中間變化,從而實現排序 歸併排序核心步驟 歸併排序的特性總結 歸併的缺點在於需要o n 的空間複雜度,歸併排序的思...
分治 歸併排序
將兩個排序好的陣列歸併過程如下 紅色的 1 是左邊起始位置 綠色的 2 是右邊起始位置 灰色的 最右邊 是右邊終點位置 include using namespace std typedef int elementtype l 左邊起始位置,r 右邊起始位置,rightend 右邊終點位置 void...