靜态查找表:隻作查找操作的查找表(順序查找、折半查找)
動态查找表:在查找過程中,同時插入新元素或删除舊元素(二叉排序樹)
1.順序查找表
- int SequentialSearch(int *a,int n,int key){
- int i;
- for(i=1;i<=n;i++){//從1開始
- if(a[i] == key){
- return i;
- }
- }
- return 0;
- }
- int SequentialSearch(int *a,int n,int key){
- int i;
- a[0] = key;//a[0]當做哨兵 ,不用每次都檢查越界問題
- i = n;//循環從尾部開始
- while(a[i] == key){
- i--;
- }
- return i;
- }
2.有序查找表
- int BinarySearch(int *a,int n,int key){//折半查找時間複雜度O(logn)
- int mid,high,low;//需要有序表順序存儲,适合靜态查找表
- low = 1;
- high = n;
- while(low<=high){//主循環
- mid = (low + high)/2;
- if(key>a[mid]){
- low = mid + 1;
- }
- else if(key<a[mid]){
- high = mid -1;
- }
- else{
- return mid;
- }
- }
- return 0;
- }
- int BinarySearch(int *a,int n,int key){//插值查找時間複雜度O(logn)
- int mid,high,low;//核心是根據要查找的關鍵字key與查找表中最大最小記錄的關鍵字比較後的查找方法
- low = 1;
- high = n;
- while(low<=high){//主循環
- mid = low + (high - low) * (key - a[low])/(a[high] - a[low]);//關鍵步驟!
- if(key>a[mid]){
- low = mid + 1;
- }
- else if(key<a[mid]){
- high = mid -1;
- }
- else{
- return mid;
- }
- }
- return 0;
- }
3.線性索引查找
索引:把一個關鍵字和與它對應的記錄相關聯的過程
1)稠密索引:将資料集中的每一個記錄對應一個索引項,索引項一定是按照關鍵碼有序排列的
2)分塊索引:把資料集分成若幹塊,塊内無序塊間有序。
索引結構為最大關鍵碼是存儲每一塊中的最大關鍵字,下一塊中的最小關鍵字也能比這一塊最大的關鍵字要大;塊數是記錄塊中的記錄個數;塊首指針是指向塊首資料元素的指針
步驟是在分塊索引中查找關鍵字所在的塊