今天数据结构上机课,老师给了我们几个上个学期做过的C语言题,我惊讶的发现,之前会的算法,时间久了就忘记了,很尴尬,这也充分说明了 我C语言学习功底不够扎实。所以,在课后,我认认真真重新推了一遍,希望下次不会忘记了。
1 #include<stdio.h> 2 main() 3 { 4 int a[]={2,4,6,8,10,12,14,16,18,20}; 5 int left,right,mid,b;//定义变量 6 printf("请输入b的值:"); 7 scanf("%d",&b);//输入要查找的值 8 left=0;//最左端的数组下角标 9 right=9;//最右边的数组下角标 10 while(left<=right)//循环条件{ 11 mid=(left+right)/2;//中间的数组下角标,特别注意 整数除整数得到的 还是整数 12 if(b>a[mid]){ 13 left=mid+1; 14 } 15 else if(b<a[mid]){ 16 right=mid-1; 17 } 18 else if(b==a[mid]){ 19 printf("查找成功,它位于第%d个",mid+1); break; 20 } 21 } 22 if(left>right){ 23 printf("您输入的值不在此范围内!"); 24 } 25 }
思路清晰后,在敲代码的过程中,也频频出现问题。例如,第18-19行,运行程序后,当查找成功时,我是没有加“break”语句跳出循环的,导致出现了死循环的状况。
此二分查找方式,在查找之前,应是已经排好序的大大减少了运算的范围,时间复杂度小,提高了效率。
下面是一种比较常用的查找方式,冒泡排序,它有很多种,可以根据自己的习惯与经验来运用。我比较热爱这种冒泡排序 1 #include<stdio 2 #include<string.h>
3 #define N 10//定义一个冒泡排序的函数 4 void sort(int a[],int n) 5 {int i,j,t; 6 for(i=0;i<n-1;i++) 7 for(j=0;j<n-i-1;j++) 8 if(a[j]>a[j+1]) 9 { 10 t=a[j];a[j]=a[j+1];a[j+1]=t; 11 } 12 } 13 main(){ 14 int a[N],i; 15 printf("\nEnter %d num:",N); 16 for(i=0;i<N;i++){ 17 scanf("%d",&a[i]); 18 } 19 printf("排序前:"); 20 for(i=0;i<N;i++){ 21 printf("\n"); 22 printf("%4d",*(a+i)); 23 } 24 sort(a,N); 25 printf("\n"); 26 printf("排序后:"); 27 for(i=0;i<N;i++){ 28 printf("\n"); 29 printf("%4d",*(a+i)); 30 } 31 }
当然我们也可以不用特意写函数来实现,可以简单的直接运用冒泡排排序啦。
以上仅为个人的理解,欢迎质疑与评论,嘻嘻
原文地址:https://www.cnblogs.com/wkx2000/p/10651252.html
时间: 2024-10-25 00:52:51