????????有時候我們需要從兩個不同數組中提取出相同的部分的數組或者計算有多少個相同的項,這個算法剛好能派上用場,
實現方案:
1、將兩個數組按從小到大排序;
2、遍歷第一個數組 array1,跟第二個數組 array2 做比較;
3、如果找到相等的則提取出該數據并且記錄下 array2 的下標到臨時變量 t,下次循環則從 array2[t+1] 開始遍歷 array2;
4、如果沒有匹配到相等的而且 array2[t] 大于與 array1 對比的數據時, 記下 array2 當前下標到臨時變量 t,下次循環則從 array2[t] 開始;
經過測試,該算法比“最笨”的作法無法在數組以何種方式排序都要強,如果量越多會越明顯,有點可惜的是暫時只能使用在 Int[] 上,有時間再想一下其它數據類型的比較
<!---->
獲取兩個整型數組中相等項的集合
#region
??獲取兩個整型數組中相等項的集合
/**/
///
?
<summary>
///
?獲取兩個整型數組中相等項的集合
///
?
</summary>
///
?
<param?name="array1"></param>
///
?
<param?name="array2"></param>
///
?
<returns></returns>
public
?
static
?
int
[]?CompareEquation(
int
[]?array1,?
int
[]?array2)
{
????
int
?i1,?i2;
????
//
?記錄第二個數組上一次匹配到的位置
????
int
?t?
=
?
0
;
????
//
?記錄相同的項
????List
<
int
>
?equal?
=
?
new
?List
<
int
>
();
????
int
[]?sort1?
=
?BubbleSort(array1);
????
int
[]?sort2?
=
?BubbleSort(array2);
????
for
?(
int
?i?
=
?
0
;?i?
<
?sort1.Length;?i
++
)
????
{
????????i1?
=
?sort1[i];
????????
for
?(
int
?j?
=
?t;?j?
<
?sort2.Length;?j
++
)
????????
{
????????????i2?
=
?sort2[j];
????????????
if
?(i2?
==
?i1)
????????????
{
????????????????equal.Add(i2);
????????????????
//
?下次比較從下一位開始
????????????????t?
=
?j?
+
?
1
;
????????????}
????????????
else
?
if
?(i2?
>
?i1)
????????????
{
????????????????
//
?下次比較繼續從這里開始
????????????????t?
=
?j;
????????????????
break
;
????????????}
????????}
????}
????
return
?equal.ToArray();
}
#endregion
<!---->
冒泡法排序(非原創)
#region
?冒泡法排序(非原創)
/**/
///
?
<summary>
///
?冒泡法排序
///
?
</summary>
///
?
<returns>
排序結果:?從小到大(升序)
</returns>
///
?
<see?cref="http://www.aspcool.com/lanmu/browse1.asp?ID=1223&bbsuser=csharp"/>
public
?
static
?
int
[]?BubbleSort(
int
[]?R)
{
????
int
?i,?j,?temp;
????
//
交換標志?
????
bool
?exchange;
????
//
最多做R.Length-1趟排序?
????
for
?(i?
=
?
0
;?i?
<
?R.Length;?i
++
)
????
{
????????
//
本趟排序開始前,交換標志應為假?
????????exchange?
=
?
false
;
????????
for
?(j?
=
?R.Length?
-
?
2
;?j?
>=
?i;?j
--
)
????????
{
????????????
//
交換條件?
????????????
if
?(R[j?
+
?
1
]?
<
?R[j])
????????????
{
????????????????temp?
=
?R[j?
+
?
1
];
????????????????R[j?
+
?
1
]?
=
?R[j];
????????????????R[j]?
=
?temp;
????????????????
//
發生了交換,故將交換標志置為真?
????????????????exchange?
=
?
true
;
????????????}
????????}
????????
//
本趟排序未發生交換,提前終止算法?
????????
if
?(
!
exchange)
????????
{
????????????
break
;
????????}
????}
????
return
?R;
}
#endregion
測試結果:
所謂的最笨的方法:
<!---->
計算兩個整型數組中數值相等的數量(最笨的方法)
#region
?計算兩個整型數組中數值相等的數量(最笨的方法)
/**/
///
?
<summary>
///
?計算兩個整型數組中數值相等的數量(最笨的方法)
///
?
</summary>
///
?
<param?name="array1"></param>
///
?
<param?name="array2"></param>
///
?
<returns></returns>
public
?
static
?
int
[]?CompareEquation1(
int
[]?array1,?
int
[]?array2)
{
????List
<
int
>
?equal?
=
?
new
?List
<
int
>
();
????
foreach
?(
int
?i1?
in
?array1)
????
{
????????
foreach
?(
int
?i2?
in
?array2)
????????
{
????????????
if
?(i1?
==
?i2)
????????????
{
????????????????equal.Add(i1);
????????????}
????????}
????}
????
return
?equal.ToArray();
}
#endregion
從圖中可以看到運行效率有了很大的提升,
以上只是不成熟的解決方案,歡迎各位一起來討論!
相關代碼下載
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

