1. 程式人生 > >[排序] 點陣圖排序 - C/C++

[排序] 點陣圖排序 - C/C++

文章目錄

點陣圖排序

點陣圖排序利用的是二進位制中每一位的值,要麼是0,要麼是1。0、1(是與不是)的邏輯清晰性,可以讓我們很高效的處理一些事情

  1. 海量資料去重
  2. 海量整型資料排序(不會重複的資料)
  3. 點陣圖法存資料
  4. 判斷資料是否存在

C++如何實現

C++有bitset,很方便的可以讓我們實現對二進位制每一位的操作

在這裡插入圖片描述
使用例子

#include <bitset>
#include <iostream>
using namespace std; int main() { const int numcount = 10; const int MAXNUM = 20; int arr[numcount] = {2,20,13,7,2,18,16,5,1,0}; bitset<MAXNUM+1> bitmap; //指定為置1 for (int i=0; i<numcount; i++) { bitmap.set(arr[i]); } //輸出排序結果; for (int i=0; i<MAXNUM; i++) { if (bitmap.test(i)
) { cout<<i<<" "; } } }

C中如何實現

  1. 用每一個元素表示一個32位的二進位制字串,這樣這個元素可以保留相鄰32個號碼是否存在的資訊
  2. 陣列範圍就下降到10000000/32了
    如對於89256,由於89256 mod 32=278餘8 --> 這樣我們應該置a[2789]中32位字串的第8位(從低位數起)為1
#define WORD 32
#define SHIFT 5 ////移動5個位,左移則相當於乘以32,右移相當於除以32取整
#define MASK 0x1F //16進位制下的31
#define N 10000000
int
bitmap[1 + N / WORD]; /* * 置位函式——用"|"操作符,i&MASK相當於mod操作 * m mod n 運算,當n = 2的X次冪的時候,m mod n = m&(n-1) */ void set(int i) { bitmap[i >> SHIFT] |= (1 << (i & MASK)); } /* 清除位操作,用&~操作符 */ void clear(int i) { bitmap[i >> SHIFT] &= ~(1 << (i & MASK)); } /* 測試位操作用&操作符 */ int test(int i) { return bitmap[i >> SHIFT] & (1 << (i & MASK)); }

相關文章

  1. 初始點陣圖排序-圖文
  2. 點陣圖排序應用