一.先要写出主函数数组内容,方便传值给排序函数
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;
}到这里,你就可以成功的写出了高效的排序和查数一体的函数了,写的时候要写一部分一检查,代码有点多,自己去写的时候可能会出现小错误。
