admin管理员组文章数量:1794759
【C语言】排序查找
上一期二分查找法中提到过二分查有个致命的缺陷,就是需要按照顺序排列才可以去查找。但是大家在使用的时候,一个一个去排序太麻烦了,这一期我将带给大家是利用冒泡排序完成二分查找法的高效方法
代码语言:javascript代码运行次数: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]);
}
return 0;
}
代码语言:javascript代码运行次数: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;
}
代码语言:javascript代码运行次数: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;
}
代码语言:javascript代码运行次数: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;
}
到这里,你就可以成功的写出了高效的排序和查数一体的函数了,写的时候要写一部分一检查,代码有点多,自己去写的时候可能会出现小错误。
本文标签: C语言排序查找
版权声明:本文标题:【C语言】排序查找 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1754758875a1706040.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论