如何對陣列的兩個子有序段進行合併

2021-07-01 22:56:43 字數 881 閱讀 1526

問題描述:陣列a[0,mid-1]和a[mid,n-1]是各子有序的,對陣列a[0,n-1]的兩個子有序段進行合併,得到a[0,n-1]整體有序。要求空間複雜度為o(1)(注:al[i]元素是支援『<'運算子的)。假定給定陣列a=,mid=5,a[0]~a[4]是有序的,a[5]~a[10]是有序的,合併後的陣列為{1,2,4,5,6,7,8,9,10,13,14}。

假定陣列中的子有序段都按公升序排列,如上例所示。下面給出在這種情況下的實現思路;

由於限定空間複雜度為o(1),因此不能使用歸併排序方法。最容易想到的是插入排序方法,但這種時間複雜度為o(n^2),空間複雜度為o(1),能滿足題目要求,但是由於插入排序方法沒有用到各子有序的條件,因此,這種演算法並不是最好的演算法,下面給出另外一種方法。

實現思路:

首先,遍歷陣列中下標為0~mid-1的元素,將遍歷到的元素的值與a[mid]進行比較,當遍歷到a[i](0<=i<=mid-1)時,如果滿足a[mid]

public static void findrightplaceformid(int a,int mid){

for(int i=mid;i

public static int merge(int a,int b){

int alength=a.length;

int blength=b.length;

int arr=new int[alength+blength];

int aleft=0;

int bleft=0;

int aright=alength-1;

int bright=blength-1;

int tmp=0;

while(aleft<=aright && bleft<=bright){

if(a[aleft]

如何合併兩個有序陣列

題目 給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。說明 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。你可以假設 nums1 有足夠的空間 空間大小大於或等於 m n 來儲存 nums2 中的元素。示...

求兩個子陣列最大的累加和

來自牛客網左程雲演算法第二堂課第一題 問題 給定乙個陣列,其中當然有很多的子陣列,在所有兩個子陣列的組合中,找到相加和最大的一組,要求兩個子陣列無重合的部分。最後返回累加和。要求 時間複雜度達到 o n 解法 我們很容易想到將整個陣列分成兩個部分,然後分別求這兩個部分子陣列的最大累加和。將結果累加起...

求兩個子陣列最大的累加和

最近在學習演算法,發現左神左程雲講的是真的好,相見恨晚,推薦大家去學習。題目 給定乙個陣列,其中當然有很多的子陣列,在所有兩個子陣列的組合中,找到相 加和最大的一組,要求兩個子陣列無重合的部分。最後返回累加和。要求 時間複雜度達到 o n 這道題要想做的順利,首先我們先需要知道乙個演算法原型,也就是...