####查找算法學習算法
#####順序查找數組
int SeqSearch(int A[],int n,int key){ int i ; for(i = 0;i<n;i++){ if(A[i] == key){ return i; //返回當前位置 } } return -1; } int main(int argc, const char * argv[]) { int A[10] = {1,2,3,4,5,6,7,8,9,0}; int data = SeqSearch(A,10, 0); printf("%d",data); return 0; }
#####折半查找(二分查找)函數
折半查找要求查找表的數據是線性結構保存,而且還要求查找表的數據是按照關鍵字由小到大有序排列學習
int BinarySearch(int A[],int n,int key){ int low,high,mid; low = 0;high = n-1; while(low<=high){ mid = (low+high)/2; if(A[mid]==key){ //若是中間的值剛好等於關鍵字的值,則返回 return mid; }else if(A[mid]>key) //若是中間值大於關鍵字 high = mid -1; //最大的值爲中間值 -1 else low = mid +1; // 最小的值爲中間值 } return -1; } int main(int argc, const char * argv[]) { int A[10] = {1,2,3,4,5,6,7,8,9,0}; int data = BinarySearch(A, 10, 3); printf("%d",data); }
#####索引查找指針
#define TABLE_LEN 30 //主表長度 #define INDEXTABLE_LEN 3 //索引表長度 typedef struct item{ int index; //索引值 int start; //開始位置 int length; //子表長度 }INDEXITEM; /*定義主表數據*/ long stu[TABLE_LEN] = { 1080101,1080102,1080103,1080104,1080105,1080106,0,0,0,0, 1080201,1080202,1080203,1080204,0,0,0,0,0,0, 1080301,1080302,1080303,1080304,0,0,0,0,0,0 }; /* 定義索引表*/ INDEXITEM indextable[INDEXTABLE_LEN] = { {10801,0,6}, {10802,10,4}, {10803,20,4} }; /* 查找*/ int IndexSearch(int key){ int i,index1,start,length; index1 = key/100; for(i = 0;i<INDEXTABLE_LEN;i++){ if(indextable[i].index==index1){ //若是在索引表中找到了 start = indextable[i].start; //得到數據初始長度 length = indextable[i].length; //得到該索引數據結束長度 break; } } if(i>=INDEXTABLE_LEN){ return -1; } for(i = start;i<start+length;i++){ //在該索引範圍查找key 值 if(stu[i] == key){ return i ; } } return - 1; } /*插入索引*/ int InsertNode(key){ int i,index1,start,length; index1 = key/100; for(i = 0;i<INDEXTABLE_LEN;i++){ if(indextable[i].index==index1){ //若是在索引表中找到了 start = indextable[i].start; //得到數據初始長度 length = indextable[i].length; //得到該索引數據結束長度 break; } } if(i>=INDEXTABLE_LEN) return -1; stu[start+length] = key; indextable[i].length++; return 0 ; } int main(int argc, const char * argv[]) { // insert code here... int key = 1080202; int pos = IndexSearch(key); printf("%d",pos); return 0; }
#####散列表 method:以線性表每一個元素的關鍵字key爲自變量,經過必定的函數關係h(key)計算出函數的值code
處理衝突索引
#define HASH_LEN 13 #define TABLE_LEN 8 int data[TABLE_LEN] = {69,65,90,37,92,6,28,54}; //原始數據 int hash[HASH_LEN] = {0}; //散列表 初始化爲0 void InsertHash(int hash[],int m,int data){ //參數hash爲散列表的首地址,參數M爲散列表長度,參數data爲須要添加到散列表的關鍵字 int i; i = data % 13; while(hash[i]) //若已經被使用,則使用線性探測法查找下一個開放地址 i = (++i) % m; hash[i] = data; } /* 建立散列表*/ void CreateHash(int hash[],int m,int data[],int n){ int i ; for(i = 0;i<n;i++){ InsertHash(hash, m, data[i]); } } /*進行hash 搜索*/ int HashSearch(int hash[],int m,int key){ int i; i = key % 13; while(hash[i]&&hash[i]!=key) i = (++i) % m ; if(hash[i]==0){ return -1; }else return i; } int main(int argc, const char * argv[]) { // insert code here... CreateHash(hash, HASH_LEN, data, TABLE_LEN); for(int i = 0;i<HASH_LEN;i++){ printf("%d ",hash[i]); } int pos = HashSearch(hash, HASH_LEN, 54); printf("%d",pos); printf("Hello, World!\n"); return 0; }