最近學校在開《數據結構》這門課程,想要借此機會順便整理一下關於查找排序等基礎方面的算法流程,之后會持續更新,並且編寫更加有深度的算法。
順序查找
定義:順序查找就是在文件的關鍵字集合key[1,2,…,n]中找出與給定的關鍵字key相等的文件記錄。
步驟:1.從文件的第一個記錄開始,將每個記錄的關鍵字與給定的關鍵字key進行比較;
2.如果查找到某個記錄的關鍵字等於key,則查找成功,返回該記錄的地址;如果所有關鍵字都與key進行了比較,但都未匹配,則本次查找失敗,返回失敗標志;
其算法描述如下:
1 int search(keytype key[],int n,keytype key) 2 { 3 int i; 4 for(i=0;i<n;i++) 5 if(key[i]==key) //查找成功 6 return i; 7 return -1; //查找失敗 8 }
在算法中,n表示記錄的個數。key表示要查找的關鍵字。key[]為關鍵字順序表,每個元素都是對應記錄的關鍵字。例如key[0]為第0個記錄的關鍵字。如果每條記錄的信息與它的關鍵字都存放在一個記錄中,如下定義:
1 typedef struct 2 { 3 keytype key; //key類型的關鍵字 4 datatype data; //記錄中的其他信息 5 }RecordType;
每個記錄中包含一個關鍵字域key和一個數據域data。這種記錄的順序查找算法可描述為:
1 int search(RecordType r[],int n,keytype key) 2 { 3 int i; 4 for(i=0;i<n;i++) 5 if(r[i].key==key) //查找成功 6 return i; 7 return -1; //查找失敗 8 }
順序查找方法的優點:簡單直觀,對於被查找的記錄在文件中的排列順序沒有限制,較適合順序文件的查找,這種查找思想也同時適用於對順序表數據結構和鏈表數據結構中元素的查找;
順序查找方法的缺點:平均查找長度過大,查找效率低。
【實例】
學號 | 姓名 | 成績 |
---|---|---|
1004 | ZHAO | 100 |
1002 | QIAN | 95 |
1001 | SUN | 93 |
1003 | LI | 98 |
編寫一個程序,要求輸出1001編號同學的具體信息。
【分析】
首先要定義結構體類型:
1 typedef struct student 2 { 3 int num; //學生編號 4 char name[20]; //學生姓名 5 float score; //學生成績 6 }Student;
為方便起見,這里直接初始化給結構體數組賦值。但在實際應用中,記錄的獲得往往都是從文件中讀取的。
接下來采用順序查找的方法找到所需編號1001學生的具體信息。這里的關鍵字為學生的學號,因為在學生記錄中,只有學號是能唯一標識學生身份的,姓名和成績都有可能相同故不能作為關鍵字。
具體代碼如下:
1 #include<stdio.h> 2 typedef struct student 3 { 4 int num; //學生編號 5 char name[20]; //學生姓名 6 float score; //學生成績 7 }Student; 8 int search(Student stu[],int n,int key) 9 { 10 int i; 11 for(i=0;i<n;i++) 12 if(stu[i].num==key) //查找成功 13 return i; 14 return -1; //查找失敗 15 } 16 main() 17 { 18 Student stu[4]={ 19 {1004,"ZHAO",100}, 20 {1002,"QIAN",95}, 21 {1001,"SUN",93}, 22 {1003,"LI",98}; //初始化結構體數組 23 int addr; //要查找的記錄的地址 24 addr=search(stu,4,1001); 25 printf("Student num : %d\n",stu[addr].num); //輸出查找到的記錄的信息 26 printf("Student name : %s\n",stu[addr].name); 27 printf("Student score : %f\n",stu[addr].score); 28 return 0; 29 }
運行結果如圖所示:
Student num : 1001
Student name : SUN
Student score : 93.000000
謝謝大家還能看到這里【鞠躬】~