1 查找數組
根據給定的值,在查找表中肯定一個其關鍵字等於給定值的數據元素數據結構
查找表:由同一類數據元素構成的集合spa
靜態查找表:只作查找操做的查找表3d
動態查找表:在查找過程當中,還能夠進行插入或刪除操做的查找表code
關鍵字:數據元素中某個數據項的值blog
主關鍵字:能夠惟一標識一個記錄的關鍵字排序
次關鍵字:能夠標識多個記錄的關鍵字索引
2 循序查找表ip
從表的第一個數據元素開始,逐個將數據元素的關鍵值與給定值相比較,若相等則表示查找到了,若不相等則表示沒有找到;ci
/* 查找數組a中,與key值相等的元素,並返回數組元素的下標 */ int seqSearch(int a[],int n,int key) { for(int i=0;i<n;i++) { if(a[i]==key) return i; } return -1; }
3 折半查找表
被查找的表的數據元素必須是升序或者降序的有序表;取中間數據元素的關鍵字與給定值比較;若相等則表示查找到了;若給定值大,則在中間到最後元素這一半中再取中間元素的關鍵字與給定值比較;若給定值小,則在第一個到中間元素這一半中再取中間元素的關鍵字與給定值比較;依次類推,直到找到或者沒找着;
/* 查找數組a中,與key值相等的元素,並返回數組元素 */ int binSearch(int a[],int n,int key) { int low=0; int high=n-1; int mid; while(low<=high) { mid=(low+high)/2; if(a[mid]==key) return mid; else if(a[mid]<key) low=mid+1; else high=mid-1; } return -1; }
4 插值查找
是對摺半查找法的改進;主要應用於關鍵字分佈比較均勻的有序表,而對不均勻的表不適用
/* 查找數組a中,與key值相等的元素,並返回數組元素 */ int binSearch(int a[],int n,int key) { int low=0; int high=n-1; int mid; while(low<=high) { mid=low+(key-a[low])/(a[high]-a[low])*(high-low); if(a[mid]==key) return mid; else if(a[mid]<key) low=mid+1; else high=mid-1; } return -1; }
5 斐波那契查找
是對摺半查找法的改進;利用黃金分割點進行數據的分割;
/* 查找數組a中,與key值相等的元素,並返回數組元素 */ int fib[10]={1,1,2,3,5,8,13,21,34,55}; int fibSearch(int a[],int n,int key) { int low=0; int high=n-1; int k=0; while(n>fib[k]-1) k++; while(low<=high) { mid=low+fib[k-1]-1; if(a[mid]==key) { if(mid<n) return mid; else return n-1; } else if(a[mid]<key) { low=mid+1; k=k-2; } else { high=mid-1; k=k-1; } } return -1; } void main() { int a[]={7,18,23,39,46,55,62,71,84,98}; fibSearch(a,10,23); }
6 線性索引查找
索引是指將關鍵字從數據元素中獨立出來,造成查找表;索引的做用是加快查找速度;索引由若干個索引項(由關鍵字和其對應記錄的存儲位置構成的一種數據結構)構成;
索引分類;
線性索引、樹形索引、多級索引
線性索引:索引項是線性表的索引,包括稠密索引、分塊索引、倒排索引
稠密索引:
索引項由關鍵字和地址構成;索引項的關鍵字是有序的,索引項的關鍵字能夠使一個數據元素中的任何一項;當須要在全部數據元素中查找某一個時,能夠使用有序查找法在索引項中經過關鍵字查找找到該數據元素。
分塊索引:
索引項由塊中最大關鍵字、塊中元素個數和塊首地址構成;索引項中的關鍵字是有序的,塊中數據元素不要求有序;索引項中的關鍵字能夠使數據元素中的任何一項;當須要在全部元素中查找某一個時,首先使用有序查找法在索引項中經過關鍵字查找到該元素所在的塊,而後使用其它查找法在塊中找到該數據元素。
倒排索引:
索引項由次關鍵字、記錄號構成;索引項中的次關鍵字是有序的;
1 | we should live by our own principles |
2 | they will live forver in our hearts |
3 | he hated to live a lie |
次關鍵字 | 記錄號 |
we | 1 |
should | 1 |
live | 一、二、3 |
by | 1 |
our | 一、2 |
own | 1 |
principles | 1 |
they | 2 |
will | 2 |
forver | 2 |
in | 2 |
heart | 2 |
he | 3 |
hated | 3 |
to | 3 |
a | 3 |
lie | 3 |
7 二叉排序樹
能夠使一棵空樹;若左子樹存在,則左子樹的全部結點的值均小於根結點的值;若右子樹存在,則右子樹的全部結點的值均大於根結點的值;左右子樹也是一棵二叉排序樹;
typedef int DataType; typedef struct BiTNode { DataType data; struct BiTNode *left,*right; }BiTNode;
7.1 插入操做
void biTInsert(BiTNode **root,DataType data) { if(*root==NULL) { BiTNode *p=(BiTNode *)malloc(sizeof(BiTNode)); p->data=data; p->left=p->right=NULL; *root=p; } else if((*root)->data<data) biTInsert(&((*root)->right),data); else biTInsert(&((*root)->left),data); }
7.2 刪除操做
1 void biTDelete(BiTNode **root,DataType data) 2 { 3 if(*root==NULL) 4 return; 5 else if((*root)->data==data) 6 { 7 BiTNode *p=*root; 8 if((*root)->left==NULL) 9 *root=(*root)->right; 10 else if((*root)->right==NULL) 11 *root=(*root)->left; 12 else 13 { 14 BiTNode *q=p->left; 15 while(q->right) 16 { 17 p=q; 18 q=q->right; 19 (*root)->data=q->data; 20 if(*root==p) 21 p->left=q->left; 22 else 23 p->right=q->left; 24 p=q; 25 } 26 free(p); 27 } 28 else if((*root)->data<data) 29 biTInsert(&((*root)->right),data); 30 else 31 biTInsert(&((*root)->left),data); 32 } 33 }
7.3 遍歷操做
BiTNode *biTTraverse(BiTNode *root,void(*visitFunc)(DataType data)) { biTTraverse(root->left); visitFunc(root->data); biTTraverse(root->right); }
7.4 建立操做
BiTNode *biTCreate() { BiTNode *root; int data; do { printf("輸入樹中一個結點:"); scanf("%d",&data); biTInsert(&root,data); }while(data != -1); return root; }