上一期二分查找法中提到过二分查有个致命的缺陷,就是需要按照顺序排列才可以去查找。但是大家在使用的时候,一个一个去排序太麻烦了,这一期我将带给大家是利用冒泡排序完成二分查找法的高效方法
一.先要写出主函数数组内容,方便传值给排序函数
int main() { int left, right; int m_ser = 0; int m_arr[20] = { 0 }; printf("要进行多少个数排序:>"); scanf("%d", &m_ser); for (int i = 0; i < m_ser; i++) { printf("输入第%d个数:>", i + 1); scanf("%d", &m_arr[i]); } return 0; }
现在是一个乱的顺序,下面定义一个新函数用来排序:
void maopao(int* m_arr, int ser) { int i, j; int mid = 0; for (i = 0; i < ser - 1; i++) { int fase = 1; for (j = 0; j < ser - 1 - i; j++) { if (m_arr[j] > m_arr[j + 1]) { mid = m_arr[j]; m_arr[j] = m_arr[j + 1]; m_arr[j + 1] = mid; fase = 0; } if (fase == 1) { break; } } } }
这里我采用的是优化的冒泡排序,不懂的可以看一下【C语言】冒泡排序+优化版,我的上一篇文章,里面有细讲冒泡排序和优化,然后我们现在传址进去进行排序。
#include <stdio.h> void maopao(int* m_arr,int ser) { int i,j; int mid=0; for(i=0;i<ser-1;i++) { int fase=1; for(j=0;j<ser-1-i;j++) { if(m_arr[j]>m_arr[j+1]) { mid=m_arr[j]; m_arr[j]=m_arr[j+1]; m_arr[j+1]=mid; fase=0; } if(fase==1) { break; } } } } int main() { int left, right; int m_ser = 0; int m_arr[20] = { 0 }; printf("要进行多少个数排序:>"); scanf("%d", &m_ser); for (int i = 0; i < m_ser; i++) { printf("输入第%d个数:>", i + 1); scanf("%d", &m_arr[i]); } maopao(&m_arr, m_ser); return 0; }
二.排过顺序后,我们现在可以开始查数字
int main() { int left, right; int m_ser = 0; int m_arr[20] = { 0 }; printf("要进行多少个数排序:>"); scanf("%d", &m_ser); for (int i = 0; i < m_ser; i++) { printf("输入第%d个数:>", i + 1); scanf("%d", &m_arr[i]); } maopao(&m_arr, m_ser); int m_c=0; //控制台输入要查的值 printf("输入你要找的数字:"); scanf("%d",&m_c); left=0; right=m_ser; while(left<=right) { int mid=(left+right)/2; if(m_arr[mid]<m_c) { left=mid+1; } if(m_arr[mid]>m_c) { right=mid-1; } if(m_arr[mid]==m_c) { printf("查到了下标:%d",mid); } } if(left>right) { printf("没查到"); } return 0; }
二分查找不懂的可以看一下【C语言】二分查找算法,讲的非常的详细。接下来我们可以开始组装了
#include <stdio.h> void maopao(int* m_arr, int ser) { int i, j; int mid = 0; for (i = 0; i < ser - 1; i++) { int fase = 1; for (j = 0; j < ser - 1 - i; j++) { if (m_arr[j] > m_arr[j + 1]) { mid = m_arr[j]; m_arr[j] = m_arr[j + 1]; m_arr[j + 1] = mid; fase = 0; } if (fase == 1) { break; } } } } int main() { int left, right; int m_ser = 0; int m_arr[20] = { 0 }; printf("要进行多少个数排序:>"); scanf("%d", &m_ser); for (int i = 0; i < m_ser; i++) { printf("输入第%d个数:>", i + 1); scanf("%d", &m_arr[i]); } maopao(&m_arr, m_ser); int m_c = 0; //控制台输入要查的值 printf("输入你要找的数字:>"); scanf("%d", &m_c); left = 0; right = m_ser; while (left <= right) { int mid = (left + right) / 2; if (m_arr[mid] < m_c) { left = mid + 1; } if (m_arr[mid] > m_c) { right = mid - 1; } if (m_arr[mid] == m_c) { printf("查到了下标:%d", mid); break; } } if (left > right) { printf("没查到"); } return 0; }
到这里,你就可以成功的写出了高效的排序和查数一体的函数了,写的时候要写一部分一检查,代码有点多,自己去写的时候可能会出现小错误。