合併兩個有序陣列,要求時間複雜度為O(n),且只要到O(1)的輔助空間
阿新 • • 發佈:2019-02-09
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;
}