#include <stdio.h> void main(){ int arry[10]; int i,j,flag=-1; int temp; //存放某一次排序当中的最大数 int count; //循环次数 printf("请输入需要排序的10个数:\n"); //输入数据 for(i=0;i<10;i++){ scanf("%d,",&arry[i]); } //输出数据 printf("\n输入的数据分别为:\n"); for(i=0;i<10;i++){ printf("%d ",arry[i]); } printf("\n"); //改进算法 for(i=0;i<9;i++){ //n个数,最多循环n-1次,即可完成排序 count=9; //防止出现越界:arry[9]>arry[10] flag=0; for(j=0;j<count;j++){ if(arry[j]>arry[j+1]){ temp=arry[j]; arry[j]=arry[j+1]; arry[j+1]=temp; flag=1; } } if(flag == 0) break; //此次循环中所有的数的位置没有发生改变,跳出循环 count--; //下一次循环的时候,最后一个数已完成排序,没有必要在此进行比较 } printf("\n按照由小到大的排序为:\n"); for(i=0;i<10;i++){ printf("%d ",arry[i]); } printf("\n"); }
#include <stdio.h> void main(){ int i,j; int arr[10]; int minNum,col; //存储某次循环中的最小值和最小值的下标 printf("输入10需要排序的数:\n"); for(i=0;i<10;i++){ scanf("%d,",&arr[i]); } printf("\n输入的10个数分别为:\n"); for(i=0;i<10;i++){ printf("%d ",arr[i]); } printf("\n\n"); //选择排序 for(i=0;i<9;i++){ minNum=arr[i]; //记录当前循环第一个值和列号 col=i; for(j=i+1;j<10;j++){ if(arr[j] < minNum){ col = j; //如果发现比minNum还要小的数,记录其列号和值 minNum = arr[col]; } } //当前循环的第一个值与最小值交换 arr[col] = arr[i]; arr[i] = minNum; } printf("10个数由小到大排序为:\n"); for(i=0;i<10;i++){ printf("%d ",arr[i]); } printf("\n"); }
4.折半查找
#include <stdio.h> void main(){ int i,j; int arr[10]; int minNum,col; //存储某次循环中的最小值和最小值的列号 int low,high,mid,num; printf("输入10需要排序的数:\n"); for(i=0;i<10;i++){ scanf("%d,",&arr[i]); } printf("\n输入的10个数分别为:\n"); for(i=0;i<10;i++){ printf("%d ",arr[i]); } printf("\n\n"); //选择排序 for(i=0;i<9;i++){ minNum=arr[i]; //记录当前循环第一个值和列号 col=i; for(j=i+1;j<10;j++){ if(arr[j] < minNum){ col = j; //如果发现比minNum还要小的数,记录其列号和值 minNum = arr[col]; } } //当前循环的第一个值与最小值交换 arr[col] = arr[i]; arr[i] = minNum; } printf("10个数由小到大排序为:\n"); for(i=0;i<10;i++){ printf("%d ",arr[i]); } printf("\n"); while(1){ //程序改进:可以将条件改为while(low<=high) 下面的条件适当修改 //折半查找 printf("\n输入要查找的数:"); scanf("%d",&num); printf("要查找的数为:%d\n",num); low = 1; high = sizeof(arr); mid = (low+high)/2; while(1){ if(num > arr[mid-1]){ low = mid+1; mid = (low+high)/2; } else if(num < arr[mid-1]){ high = mid-1; mid=(low+high)/2; } else{ printf("%d已经找到,是第%d个数!\n",arr[mid-1],mid); break; } if((low == high) && num != arr[mid-1]){ //当low和high的值相同,并且num与mid指向的值不相同时代表没有找到该数 printf("%d在该序列中不存在!\n",num); break; } } } }
#include <stdio.h> int insertLoc(int arry[],int num){ int low,high,mid; low=1; high=10; mid=(low+high)/2; while(low<=high){ if(num>arry[mid-1]){ low=mid+1; mid=(low+high)/2; } else if(num < arry[mid-2]){ high=mid-1; mid = (low+high)/2; } else{ return mid; break; } } return low; //当low == high时,不管num与中间数的大小关系,low始终指向要插入的位置,即:小则 } void main(){ int arr[11]; int i,j; int num,loc; int insertLoc(int arry[],int num); printf("请输入10个有序的数:\n"); for(i=0;i<10;i++){ scanf("%d,",&arr[i]); } printf("\n输入的10个数分别为:\n"); for(i=0;i<10;i++){ printf("%d ",arr[i]); } printf("\n输入需要插入的数:"); scanf("%d",&num); loc=insertLoc(arr,num); printf("插入的位置为:%d\n",loc); for(i=10;i>loc-2;i--){ arr[i] = arr[i-1]; } arr[loc-1]=num; printf("插入后的序列为:\n"); for(i=0;i<11;i++){ printf("%d ",arr[i]); } printf("\n"); }

1547

被折叠的 条评论
为什么被折叠?



