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语言】冒泡排序+优化版,我的上一篇文章,里面有细讲冒泡排序和优化,然后我们现在传址进去进行排序。

a56a4b5b942141cea073307d87e7d628.png
代码语言:javascript代码运行次数:0运行复制
#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;
}

二分查找不懂的可以看一下【C语言】二分查找算法,讲的非常的详细。接下来我们可以开始组装了

代码语言:javascript代码运行次数:0运行复制
#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;
}

到这里,你就可以成功的写出了高效的排序和查数一体的函数了,写的时候要写一部分一检查,代码有点多,自己去写的时候可能会出现小错误。

b99f2d13b91f4b6ea7ec75895b8bd1cf.gif
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2023-10-11,如有侵权请联系 cloudcommunity@tencent 删除优化intscanf函数排序

本文标签: C语言排序查找