寫下這段文字純粹因為太生疏了。
下午花了很多時間寫有序陣列的歸併陷入死胡同,結果是證明了兩個陣列歸併沒有輔助陣列時不幸的。
通常的陣列歸併,對於大小為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 然後跳出這個迴...