实验结论:
1,二分查找:
①:利用数组传递变量:
1 // 练习:使用二分查找,在一组有序元素中查找数据项 2 // 形参是数组,实参是数组名 3 #include <stdio.h> 4 const int N=5; 5 int binarySearch(int x[], int n, int item); 6 int main() { 7 int a[N]={1,3,9,16,21}; 8 int i,index, key; 9 10 printf("数组a中的数据:\n"); 11 for(i=0;i<N;i++) 12 printf("%d ",a[i]); 13 printf("\n"); 14 15 printf("输入待查找的数据项: "); 16 scanf("%d", &key); 17 18 // 调用函数binarySearch()在数组a中查找指定数据项item,并返回查找结果给index 19 // 补足代码① 20 // ××× 21 index= binarySearch(a,N,key); 22 if(index>=0) 23 printf("%d在数组中,下标为%d\n", key, index); 24 else 25 printf("%d不在数组中\n", key); 26 27 return 0; 28 } 29 30 31 //函数功能描述: 32 //使用二分查找算法在数组x中查找特定值item,数组x大小为n 33 // 如果找到,返回其下标 34 // 如果没找到,返回-1 35 int binarySearch(int x[], int n, int item) { 36 int low, high, mid; 37 38 low = 0; 39 high = n-1; 40 41 while(low <= high) { 42 mid = (low+high)/2; 43 44 if (item == x[mid]) 45 return mid; 46 else if(item<x[mid]) 47 high = mid - 1; 48 else 49 low = mid + 1; 50 } 51 52 return -1; 53 }
运行截图:
②:利用指针变量:
1 // 练习:使用二分查找,在一组有序元素中查找数据项 2 // 形参是指针变量,实参是数组名 3 #include <stdio.h> 4 const int N=5; 5 int binarySearch(int *x, int n, int item); 6 int main() { 7 int a[N]={1,3,9,16,21}; 8 int i,index, key; 9 10 printf("数组a中的数据:\n"); 11 for(i=0;i<N;i++) 12 printf("%d ",a[i]); 13 printf("\n"); 14 15 printf("输入待查找的数据项: "); 16 scanf("%d", &key); 17 18 // 调用函数binarySearch()在数组a中查找指定数据项item,并返回查找结果 19 // 补足代码① 20 // ××× 21 index= binarySearch(a, N, key); 22 if(index>=0) 23 printf("%d在数组中,下标为%d\n", key, index); 24 else 25 printf("%d不在数组中\n", key); 26 27 return 0; 28 } 29 30 //函数功能描述: 31 //使用二分查找算法在x指向的数据项开始的n个数据中,查找item 32 // 如果找到,返回其位置 33 // 如果没找到,返回-1 34 int binarySearch(int *x, int n, int item) { 35 int low, high, mid; 36 37 low = 0; 38 high = n-1; 39 40 while(low <= high) { 41 mid = (low+high)/2; 42 43 if (item == *(x+mid)) 44 return mid; 45 else if(item < *(x+mid)) 46 high = mid - 1; 47 else 48 low = mid + 1; 49 } 50 51 return -1; 52 }
运行截图:
2. 选择法排序:
①:对整数排序:(照搬老师的成果QAQ)
1 // 示例: 使用选择法排序对一组整数由小到大排序 2 #include <stdio.h> 3 const int N=5; 4 void selectSort(int [], int); // 函数声明(函数声明中可以省略变量名、数组名) 5 void input(int [], int); 6 void output(int [], int); 7 int main() { 8 int a[N]; 9 10 printf("输入%d个整数\n", N); 11 input(a, N); 12 13 printf("排序前的数据:\n"); 14 output(a,N); 15 16 selectSort(a,N); // 调用selectSort()对数组a中的N个元素排序 17 18 printf("排序后的数据:\n"); 19 output(a, N); 20 21 return 0; 22 } 23 24 // 函数定义 25 // 函数功能描述:输入n个整数到数组a中 26 void input(int a[], int n) { 27 int i; 28 for(i=0; i<n; i++) 29 scanf("%d", &a[i]); 30 } 31 32 // 函数定义 33 // 函数功能描述:输出数组a中的n个整数 34 void output(int a[], int n) { 35 int i; 36 for(i=0; i<n; i++) 37 printf("%d ", a[i]); 38 printf("\n"); 39 } 40 41 // 函数定义 42 // 函数功能描述:使用选择法对数组a中的n个整数由小到大排序 43 void selectSort(int a[], int n) { 44 int i, j, k, temp; 45 46 for(i=0; i<n-1; i++) { 47 k = i; // k用于记录当前最小元素的下标 48 49 for(j=i+1; j<n; j++) 50 if (a[j] < a[k]) 51 k = j; // 如果a[j]比当前最小元素还要小,就更新k,确保它总是存放最小元素的下标 52 53 if(k != i) { // 找到最小元素后,交换a[i]和a[k] 54 temp = a[i]; 55 a[i] = a[k]; 56 a[k] = temp; 57 } 58 } 59 }
②:对字符串排序:
1 // 练习:使用选择法对字符串按字典序排序 2 #include <stdio.h> 3 #include <string.h> 4 void selectSort(char str[][20], int n ); // 函数声明,形参str是二维数组名 5 int main() { 6 char name[][20] = {"John", "Alex", "Joseph", "Candy", "Geoge"}; 7 int i; 8 9 printf("输出初始名单:\n"); 10 for(i=0; i<5; i++) 11 printf("%s\n", name[i]); 12 13 selectSort(name, 5); // 调用选择法对name数组中的字符串排序 14 15 printf("按字典序输出名单:\n"); 16 for(i=0; i<5; i++) 17 printf("%s\n", name[i]); 18 19 return 0; 20 } 21 22 // 函数定义 23 // 函数功能描述:使用选择法对二维数组str中的n个字符串按字典序排序 24 void selectSort(char str[][20], int n) { 25 // 补足代码 26 // ××× 27 int i,j,k; 28 char t[20]; 29 for(i=0; i<n-1; i++) { 30 k = i; 31 for(j=i+1; j<n; j++) 32 if (strcmp(str[j],str[k]) <0) 33 k=j; 34 if(k != i) { 35 strcpy(t,str[i]); 36 strcpy(str[i],str[k]); 37 strcpy(str[k],t); 38 } 39 } 40 }
用指针处理字符串部分,因为是老师写好的完整代码,所以在总结和体会中再po出吧
第二部分:总结与体会:
第一:关于二分查找: 这个方法和高中的数学其实很相似,所以理解起来也没有很复杂,大致方法我再抄一下老师写的便于我更好的记忆:
二分查找 待查找的数据序列必须满足两个条件:① 顺序存储;② 元素有序。
二分查找的方法:
把待查找数据项x与有序序列的中间项元素进行比较:(设有序数据序列是由小→大的)
如果item == 中间项元素,则表示找到;
如果item < 中间项元素,则在序列的前半部分以二分法继续查找;
如果item> 中间项元素,则在序列的后半部分以二分法继续查找
做程序时候的话 自己感觉还是不是很好上手,可能是自己真的在计算机这方面很不熟悉吧 碰到自己填程序了就觉得大脑放空,完全不知道怎么补足,理解别人的完整程序还是可以的 所以我发现我只会依葫芦画瓢,不太行,自己还是得多去上上机,练练能力
在形参、实参写法,以及函数实现中数组元素表示的差异:
纯用数组的话,理解起来比较容易 上手方便,但是做起来比较繁琐不太方便
使用指针变量以后会使次函数里面的一些语句变得简单和清楚,但是自己写出来不太会想到这个方法。
第二,实验内容2:选择法排序
使用选择法对字符串排序时注意事项:
首先我觉得看见字符串 交换比较复制的时候就不能用****==*** 等等等等之类的赋值语句了 应该要用几种专门的公式来进行比较复制等操作,这是最为关键的我觉得
其次,在字符串进行操作时,应该记得定义的时候用char 输出的时候用%s 这些小细节应当注意了。
第三,实验内容3:使用指针变量对字符串进行处理
注意事项总结:
首先:字符串操作的那些注意事项参考上一条
其次,使用指针变量时候应该注意每次使用*p时 应该要先给它指向一个数组,不然就会出现错误,
最后一些指针变量使用起来的便捷写法,我们应该看得懂并理解,必要时可以使用就最好了(虽然我觉得我写不了)
在给指针变量指向一个数组以后,它就可以代表这个数组进行一些操作了 这点也是要注意的哦
(水平有限 理解的就这么多了 课后会自我巩固的QAQ)
互评:①:https://www.cnblogs.com/gundongtiao/p/10926672.html
②:https://www.cnblogs.com/qwer9107/p/10931562.html
③:https://www.cnblogs.com/silentisland/p/10913271.html