1. 程式人生 > >合併兩個有序陣列,要求時間複雜度為O(n),且只要到O(1)的輔助空間

合併兩個有序陣列,要求時間複雜度為O(n),且只要到O(1)的輔助空間

i= 0表示有序陣列arr1的首元素,j = 未知,表示有序陣列arr2的首元素
①首先比較第一個有序陣列arr1和第二個有序陣列arr2第一個元素的大小
如果arr1[i] < arr[j],i++
否則 index記住j的位置,index就是j變化之前的位置
②如果arr2[j] < arr[i],證明後面的元素小於後面的元素,需要進行往前的置換,所以j++,但是要保證j++不能越界
③進行了①和②之後,已經找到了需要置換兩個陣列的範圍,使用swap交換
④進行i下標的更新,因為i+j-index已經排序好了,所以i要加上j-index
⑤直到while(i < j &&j < 陣列的長度)不成立,程式結束
這裡寫圖片描述

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

template <typename CONT>
void reverse(CONT &arr, int begin, int end)
{
    for (int i = 0; i < (end - begin + 1) / 2; i++)
    {
        auto temp = arr[begin + i];
        arr[begin + i] = arr[end - i];
        arr[end - i] = temp;
    }
}

template
<class CONT> void swap(CONT &a, int left, int middle, int right) //三次翻轉,就可以轉換兩個位置陣列 { reverse(a, left, middle - 1); reverse(a, middle, right - 1); reverse(a, left, right - 1); } template <class CONT> void merge_twoarray(CONT &arr, int arr2_begin) { int i = 0; int
j = arr2_begin; int index; while (i < j && j <= arr.size()) { while (arr[i] < arr[j]) i++; index = j; while (arr[j] < arr[i] && j != arr.size()) { j++; } // rotate(arr.begin() + i, arr.begin() + index, arr.begin() + j); //庫函式可以代替swap swap(arr, i, index, j); i += j - index; } } int main() { vector<int> arr{1, 3, 5, 7, 9, 2, 4, 6, 8, 10}; int arr2_begin; cout << "請輸出陣列2的起始位置:"; cin >> arr2_begin; merge_twoarray(arr, arr2_begin); for (int i : arr) cout << i << " "; return 0; }