有時候我們需要從兩個不同數組中提取出相同的部分的數組或者計算有多少個相同的項,這個算法剛好能派上用場,
實現方案:
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
從圖中可以看到運行效率有了很大的提升,
以上只是不成熟的解決方案,歡迎各位一起來討論!
相關代碼下載