1、用函数实现二分法查找;
问题及代码:
/*在一个数组中,查找某个值的位置*/ #include<stdio.h> #define SIZE 10 int binary_search(int[],int,int) ; //声明一个合并功能的函数 int main() { int a[SIZE]={25,45,36,48,89,57,65,25,26,16}; int key,index=-1; int low,high,mid; printf("请输入要查找的值"); scanf("%d",&key); //%d后面多了一个\n导致程序不能运行,为何? index=binary_search(a,SIZE,key); //函数实参:数组名及长度,输入值,返回k; if(index>=0) printf("它的位置是%d\n",index); //输出查找的元素值得位置; else printf("没有找到!\n"); return 0; } /* 功能:在长度为n的数组中查找k出现的位置;; 入口参数: 数组名,数组大小,查找的值; 返回值:查找的值的位置; */ int binary_search(int arr[],int n,int k) { int i=-1; //初始化为负数,指找不到; int low=0,high=n-1,mid; while(low<=high) //这里如果用for循环,该如何设置步长 { mid=(low+high)/2; if(arr[mid]==k) { i=mid; break; } else if(arr[mid]>k) high=mid-1;//mid已经判断过了,所以,要mid-1; else low=mid+1; //mid已判断过了,所以应mid+11; } return i; }
运行结果:
学习心得:
二分法查找,注意要定义一个找不到的情况;
知识总结:
当输入57及之后的数字,返回结果是没有找到,这是为何?
2、用函数实现选择法算法;
问题及代码:
/*对一个数组进行排序*/ #include <stdio.h> void search_sort(int[],int); #define SIZE 10 int main( ) { int i; int a[SIZE] = {1, 3, 9, 12, 32, 41, 45, 62, 75, 77}; search_sort(a,10); printf("排序:\n"); for(i=0;i<SIZE;i++) printf("%d\n",a[i]); return 0; } /* 功能:选择法对数组进行排序; 入口参数:数组名,长度; 返回值:无返回值; */ void search_sort(int arr[],int n) { int i,j,k,t; for(i=0;i<n-1;i++) //为何只要循环到n-1 { k=i; //先设定一个最小值; for(j=i+1;j<n;j++) if(arr[j]<arr[k]) k=j; //通过循环得到k最小; t=arr[k]; //交换a[i]和a[k]; arr[k]=arr[i]; arr[i]=t; } return ; }运行结果:
学习心得:
自定义排序函数;
知识总结: