【C语言】排序查找

简介: 【C语言】排序查找

上一期二分查找法中提到过二分查有个致命的缺陷,就是需要按照顺序排列才可以去查找。但是大家在使用的时候,一个一个去排序太麻烦了,这一期我将带给大家是利用冒泡排序完成二分查找法的高效方法


一.先要写出主函数数组内容,方便传值给排序函数

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;
}

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

相关文章
|
5月前
|
C语言
【C 语言经典100例】C 练习实例37 - 排序
【C 语言经典100例】C 练习实例37 - 排序
29 0
|
5月前
|
编译器 C语言
C语言进阶⑯(自定义类型)项目:静态通讯录,增删查改排序打印。
C语言进阶⑯(自定义类型)项目:静态通讯录,增删查改排序打印。
46 1
|
8天前
|
NoSQL 算法 Redis
Redis的实现三:c语言实现平衡二叉树,通过平衡二叉树实现排序集
本博客介绍了如何在C语言中实现一个平衡二叉树,并通过这个数据结构来模拟Redis中的排序集功能。
9 0
|
5月前
|
存储 C语言
Leetcode—— 删除排序数组中的重复项——C语言
Leetcode—— 删除排序数组中的重复项——C语言
|
5月前
|
存储 搜索推荐 算法
C语言数据结构算法,常用10种排序实战
插入排序(Insertion Sort) 希尔排序(Shell Sort) 选择排序(Selection Sort) 冒泡排序(Bubble Sort) 归并排序(Merge Sort) 快速排序(Quick Sort) 堆排序(Heap Sort) 基数排序(Radix Sort)
53 1
C语言数据结构算法,常用10种排序实战
|
5月前
|
算法 搜索推荐 数据处理
C语言中的排序与查找技术详解
C语言中的排序与查找技术详解
56 1
|
5月前
|
C语言
【C语言/数据结构】排序(直接插入排序|希尔排序)
【C语言/数据结构】排序(直接插入排序|希尔排序)
34 4
|
5月前
|
搜索推荐 C语言
【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)
【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)
35 0
|
5月前
|
C语言
【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)
【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)
41 0
|
5月前
|
C语言
【C语言/数据结构】排序(选择排序,推排序,冒泡排序)
【C语言/数据结构】排序(选择排序,推排序,冒泡排序)
29 0