有序陣列歸併

2021-05-21 21:05:37 字數 1369 閱讀 1791

寫下這段文字純粹因為太生疏了。

下午花了很多時間寫有序陣列的歸併陷入死胡同,結果是證明了兩個陣列歸併沒有輔助陣列時不幸的。

通常的陣列歸併,對於大小為m和n的陣列,需要m+n的輔助陣列,寫起來並不複雜。

有次面試的時候要求寫乙個只有n輔助大小的做法。將b陣列拷到a陣列中,然後在a,b中選小的逐個放入a中。

複雜一點,除了省點記憶體外意義不大,可能效率還降低。

以下**在vs2005下編譯執行。

#include

#include

using namespace std;

void mergearr(int* a, int m, int* b, int n)

else

}if (posa == a + m)

}else

}memcpy(a, assit, sizeof(int) * (m + n));

}int main()

printf("輸入陣列大小:");

scanf("%d", &n);

b.resize(n);

for (int i = 0; i < n; ++i)

a.resize(m + n);

mergearr(&a[0], m, &b[0], n);

for (int i = 0; i < m + n; ++i)

putchar('/n');

return 0;

}最少交換次數

將乙個無序序列變成有序(序列中沒有相等的數),可以進行任意兩個位置的交換操作,求最少的交換次數

如:5 2 1 4 3

轉成:0 1 4 5 9

迴圈分解:

(9 0 4)(1)(5),只需將(9 0 4)分解即可。

而(1 2 ... n)=(1 2 ... n-1)(1 n)=(1 2)(1 3)...(1 n)

因此(9 0 4)可以分解為兩個置換。

所以該序列只需經過兩次交換即可。按照這種做法,對於乙個序列,我們對其迴圈分解,n-迴圈總數即是交換次數。

**如下(vc2005):

#include

#include

using namespace std;

using namespace stdext;

int main()

//只有乙個在雜湊表中,將沒在雜湊表中的加入

else

}else if (notin_2)

//兩個都在表中,什麼也不做

}printf("最少需要交換%d次./n", n - loops);

}這比求逆序數更快,只有o(n)的複雜度,掃瞄一次即可。

疑問:這種做法求出來的是否是最少交換?

如果序列中有重複怎麼解決?

歸併兩個有序陣列

題目 有兩個有序的陣列a1和a2,內存在a1的末尾有足夠多的空餘空間容納a2。請實現乙個函式,把a2中的所有數字插入到a1中並且所有的數字是排序的。解法 從後向前依次比較處理,減少移動次數,提高效率。void sorta1a2 int a1,int length1,int sizeofa1,int ...

無序陣列的歸併排序與合併多個有序陣列

1.什麼是歸併排序?歸併排序先把大的陣列的合併問題拆分成多個小的區間,然後兩兩進行合併。核心思想是遞迴 歸併 遞迴 把大區間拆分成無數個小區間 歸併 把兩個小區間合併成乙個大區間 解題思路 遞迴 兩個有序列表的合併 1.案例1 對無序的陣列進行歸併排序 如下 public static void m...

Java有序陣列

1 有序陣列簡介,以及優缺點 2 構建有序陣列 在陣列增刪改查功能裡,我們是如何讓陣列有序的呢?肯定是新增方法 1 我們在新增的時候可以進行乙個判斷 2 判斷我們這個新新增的資料到底是新增在哪個地方在哪個位置 接下來插入資料 public void insert int values 然後跳出這個迴...