有趣的位圖排序算法

有趣的位圖排序算法


這幾天在看《編程珠璣》,其中看到了一個非常有趣的排序算法,個人認爲這個算法比較另類,在這裏拿出來和大家分享。此算法代碼量十分的少,排序效率又很高,但它是也有一些特定條件在裏面。


先說說思路和特定條件,實際的問題是,有一個文件裏面包含7位電話號碼,對電話號碼進行排序,電話號碼之間不重複。我將其歸納爲:對一個最多可以是1千萬個數字的集合的數組進行排序,數組中最大的數字是1千萬,數字之間不能重複。


算法的思路是(我這裏以c#代碼爲例),創建一個byte[n]的比特數據,n=1千萬。
1、關閉所有的位,將集合初始化爲空
2、讀取集合中的每一個整數,打開相應的位
3、檢查每個位,如果打開就輸出整數
源代碼爲:
public static int[] Sort(int[] arr)
{
int n = 10000000;
byte[] bytes = new byte[n];
for (int i = 0; i < arr.Length; i++)
{ bytes[arr[i]] = 1; }
List<int> result = new List<int>();
for (int i = 0; i < bytes.Length; i++)
{
if (bytes[i] == 1)
{ result.Add(i); }
}
return result.ToArray();
}
做一個簡單的單元測試
[TestMethod()]
public void BitmapSortTest()
{
int[] i = new int[] { 10, 50, 90, 11, 51, 91, 2, 3, 4, 80, 5 };
i = BitmapSort.Sort(i);
Assert.IsTrue(i[0] == 2);
Assert.IsTrue(i[1] == 3);
Assert.IsTrue(i[2] == 4);
Assert.IsTrue(i[3] == 5);
Assert.IsTrue(i[4] == 10);
Assert.IsTrue(i[5] == 11);
Assert.IsTrue(i[6] == 50);
Assert.IsTrue(i[7] == 51);
Assert.IsTrue(i[8] == 80);
Assert.IsTrue(i[9] == 90);
Assert.IsTrue(i[10] == 91);
}


這個算法的思路很帥氣,而且我們只在內存中開了一個byte[10000000]的比特數組,也就是說內存的消耗很小。當然我們還可以改進,如果中間數字有重複的怎麼辦呢?其實也很簡單,用字符串數組代替比特數組,將設置爲1的操作變成自增1,在進行輸出的時候數字是幾,這個數組輸出幾次,不就完美的解決問題了嗎。


看是不是很有趣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章