C语言中的查找与排序算法整理
查找与排序算法整理
1 查找算法
1.1 顺序查找
1.1.1 算法原理
顺序查找又称线性查找,是一种基本的查找算法,其原理是:
- 从头开始遍历:从数据集的起始位置开始,逐个检查每个元素。
- 比较目标:对于每个遍历到的元素,将其与目标元素进行比较。
- 查找成功:如果当前元素等于目标元素,则查找成功,返回当前元素的索引。
- 查找失败:如果遍历完整个数据集仍未找到目标元素,则查找失败,返回一个特殊的标识来表示未找到。
1.1.2 代码实现
/***********************************************************
* 顺序查找
* 时间复杂度: 最优O(1)、最高O(n)、平均O(n/2)
* 空间复杂度: O(1)
***********************************************************/
#include <stdio.h>
/**
* @brief 查找元素所在的位置
* @param int *arr 数组
* @param int len 数组长度
* @param int target 要查找的元素
* @return int 元素的位置,如果没有找到返回 -1
*/
int sequenceSearch(int *arr, int len, int target)
{
for (int i = 0; i < len; i++)
{
if (arr[i] == target)
{
return i;
}
}
return -1;
}
int main()
{
int nums[6] = {10, 11, 7, 89, 23, 19};
printf("7在数组中的位置:%d \n", sequenceSearch(nums,6, 7));
printf("27在数组中的位置:%d \n", sequenceSearch(nums,6, 27));
return 0;
}
1.2 二分查找
1.2.1 算法原理
二分查找(Binary Search)是一种高效的搜索算法,通常用于有序数据集中查找目标元素。其原理是通过将数据集划分为两半并与目标进行比较,以确定目标在哪一半中,从而逐步缩小搜索范围,直到找到目标元素或确定不存在。基本原理如下:
- 选择中间元素: 在有序数据集中,选择数组的中间元素。
- 比较目标: 将中间元素与目标元素进行比较。
- 查找成功: 如果中间元素等于目标元素,则查找成功,返回中间元素的索引。
- 缩小搜索范围: 对于一个升序的数据集,如果中间元素大于目标元素,说明目标可能在左半部分;如果中间元素小于目标元素,说明目标可能在右半部分。根据比较结果,将搜索范围缩小到一半,继续查找。
- 重复步骤: 重复上述步骤,不断将搜索范围缩小,直到找到目标元素或搜索范围为空。

1.2.2 代码实现
/***********************************************************
* 二分查找
***********************************************************/
#include <stdio.h>
/**
* @brief 查找元素所在的位置
* @param int *arr 排好序数组
* @param int len 数组长度
* @param int target 要查找的元素
* @return int 元素的位置,如果没有找到返回-1
*/
int binarySearch(int *arr, int len, int target)
{
int start = 0;
int end = len - 1;
while (start <= end)
{
// 计算中间元素下标
int mid = (start + end) / 2;
// 判等
if (arr[mid] == target)
{
return mid;
}
else if (target < arr[mid])
{
// 缩小搜索范围至左半部分
end = mid - 1;
}
else if (target > arr[mid])
{
// 缩小搜索范围至右半部分
start = mid + 1;
}
}
return -1;
}
int main()
{
int nums[] = {-10, 2, 8, 16, 109, 901, 5000};
int len = sizeof(nums) / sizeof(int);
printf("901在数组中的位置:%d \n", binarySearch(nums, len, 901));
printf("901在数组中的位置:%d \n", binarySearch(nums, len, 3));
return 0;
}
说明:二分查找的时间复杂度是 O(logn),仅适用于有序数据集。
2 排序算法
2.1 十大常见的排序算法
排序算法很多,实现方式各不相同,时间复杂度、空间复杂度、稳定性也各不相同:

2.2 冒泡排序
2.2.1 算法原理
冒泡排序原理如下:
- 比较相邻元素: 从数组的第一个元素开始,依次比较相邻的两个元素。
- 交换位置: 如果前面的元素比后面的元素大(或小,根据升序或降序排序的要求),则交换这两个元素的位置。
- 一趟遍历完成后,最大(或最小)元素已移至末尾: 经过一趟遍历,最大(或最小)的元素会被交换到数组的最后一个位置。
- 重复进行遍历和交换: 除了最后一个元素,对数组中的所有元素重复执行上述两步,每次遍历都会将当前未排序部分的最大(或最小)元素放置到合适的位置。
- 循环遍历: 重复执行步骤 3 和步骤 4,直到整个数组都被排序。

2.2.2 代码实现
#include <stdio.h>
/**
* @brief 交换两个变量或元素的值
* @param int *a
* @param int *b
*/
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
/**
* @brief 定义函数 打印数组所有元素
*/
void printArr(int *arr, int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
}
/**
* @brief 冒泡排序
* @param int *arr 要排序的数组
* @param int len 数组长度
*/
void bubbleSort(int *arr, int len)
{
// 外层循环 控制轮数 比较 len-1轮
for (int n = 1; n < len; n++)
{
// 内层循环 控制本轮的比较
for (int i = 0; i < len - n; i++)
{
// 如果前面的元素大,交换两个元素的值
if (arr[i] > arr[i + 1])
{
swap(&arr[i], &arr[i + 1]);
}
}
}
}
int main()
{
// 定义数组
int nums[8] = {30, 87, 23, 1023, 3, 5, 41, 2};
int len = sizeof nums / sizeof(int);
// 排序前
printf("排序前:");
printArr(nums, len);
printf("\n");
// 进行冒泡排序
bubbleSort(nums, len);
// 排序后
printf("排序后:");
printArr(nums, len);
printf("\n");
// // 第一轮比较
// for (int i = 0; i < len - 1; i++)
// {
// // 如果前面的元素大,交换两个元素的值
// if (nums[i] > nums[i + 1])
// {
// swap(&nums[i], &nums[i + 1]);
// }
// }
// printf("第一轮比较后:");
// printArr(nums, len);
// printf("\n");
// // 第二轮比较
// for (int i = 0; i < len - 2; i++)
// {
// // 如果前面的元素大,交换两个元素的值
// if (nums[i] > nums[i + 1])
// {
// swap(&nums[i], &nums[i + 1]);
// }
// }
// printf("第二轮比较后:");
// printArr(nums, len);
// printf("\n");
return 0;
}
说明:冒泡排序的平均时间复杂度为 O(n²),空间复杂度为 O(1),是一种稳定的排序算法,适用于小规模数据的排序场景。
C语言中的查找与排序算法整理的更多相关文章
- C语言中的七种排序算法
堆排序: void HeapAdjust(int *arraydata,int rootnode,int len) { int j; int t; *rootnode+<len) { j=*ro ...
- 我们一起来排序——使用Java语言优雅地实现常用排序算法
破阵子·春景 燕子来时新社,梨花落后清明. 池上碧苔三四点,叶底黄鹂一两声.日长飞絮轻. 巧笑同桌伙伴,上学径里逢迎. 疑怪昨宵春梦好,元是今朝Offer拿.笑从双脸生. 排序算法--最基础的算法,互 ...
- 【CSWS2014 Summer School】互联网广告中的匹配和排序算法-蒋龙(下)
[CSWS2014 Summer School]互联网广告中的匹配和排序算法-蒋龙(上) Fig19,用到了矩阵,这个我没有听太明白,蒋博士也没有详细说明.不过可以明确的一点就是,我们常说的K-mea ...
- (排序算法整理)NEFU 30/32
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/caihongshijie6/article/details/26165093 事实上, ...
- 排序算法整理C++(初赛)
排序算法整理 常见考点 将一个乱掉的字符串排回有序(以交换为基本操作)的最少操作,就是冒泡排序. 排序算法的稳定性 排序算法的时间复杂度 排序算法的稳定性 稳定性是指排序前两个元素a1 = a2,a1 ...
- 具体解释Redis源代码中的部分高速排序算法(pqsort.c)
看标题.你可能会疑惑:咦?你这家伙.怎么不解说完整的快排,仅仅讲一部分快排---.- 哎,冤枉. "部分快排"是算法的名字.实际上本文相当具体呢.本文差点儿与普通快排无异.看懂了本 ...
- 查找与排序算法(Searching adn Sorting)
1,查找算法 常用的查找算法包括顺序查找,二分查找和哈希查找. 1.1 顺序查找(Sequential search) 顺序查找: 依次遍历列表中每一个元素,查看是否为目标元素.python实现代码如 ...
- 【C语言编程入门笔记】排序算法之快速排序,一文轻松掌握快排!
排序算法一直是c语言重点,各个算法适应不用的环境,同时,在面试时,排序算法也是经常被问到的.今天我们介绍下快速排序,简称就是快排. 1.快速排序思想: 快排使用 分治法 (Divide and con ...
- Java中几种常见排序算法
日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序等. 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数 ...
- Java中的数据结构及排序算法
(明天补充) 主要是3种接口:List Set Map List:ArrayList,LinkedList:顺序表ArrayList,链表LinkedList,堆栈和队列可以使用LinkedList模 ...
随机推荐
- 放弃Cursor,拥抱Claude code(白嫖100美金余额,可以用Claude Sonnet 4)
前言 之前一直在使用Cursor,但是最近Cursor一直偷偷改价降智,不是那么好用了,Claude的公司Anthropic自己推出AI编程工具Claude code体验了一下,感觉非常的丝滑,主要是 ...
- mysql 笛卡尔积
简介 新生成的表的行数 第一个表的行数 * 第二个表的行数 参考链接 mysql 必知必会
- 普通Java项目使用Hibernate Validator进行数据校验参数校验 校验Bean
背景 最近有负责维护一个专门做对外数据接口的项目,由于接口数据需要加密,而且解密后的数据需要校验,手动ifelse判断非常繁琐,因此想使用hibernate validator在数据解密后手动进行校验 ...
- SciTech-Mathmatics-https://www.desmos.com: we want to help everyone learn math, love math, and grow with math. CAASPP: Student Performance and Progress (CAASPP) System
https://www.caaspp.org https://blog.desmos.com/articles/the-desmos-guide-to-building-great-digital-m ...
- Win10纯净版如何设置文件夹加密的问题
有一位雨林木风官网的用户,因为工作需要,使用Win10系统一些文件是公司机密,需要加密文件夹来保护,哪我们应该如何设置呢?接下来,ylmf系统小编就来分享具体的处理方法,大家一起看看! 操作方法 1. ...
- Unity IL2CPP发布64位,以及代码裁剪Strip Engine Code
说明 https://blog.csdn.net/final5788/article/details/100183528 当裁剪发生了查看什么被裁剪了 https://blog.csdn.net/Zh ...
- 用dig命令查询DNS信息
Linux下的dig命令,可以用来进行DNS信息的查询. dig命令与nslookup命令相似,但要更好用一些. dig 命令是常用的域名查询工具,可以用来测试域名系统工作是否正常.域名服务器(DNS ...
- flask四件套、flask注册路由、flask获取post请求传入的数据、flask开启debug模式
flask四件套 返回模板:return render_template('detail.html', **{'user': user}) # context跟djagno不一样 返回重定向:retu ...
- [题解]P3413 萌数
P3413 萌数 先打出暴搜代码,参数有\(pos,limit,hui\),其中bool类型的\(hui\)表示到当前是否有回文. 暴搜代码中加入了一个剪枝:if(!limit&&hu ...
- 项目管理工具大横评:10 款 Jira 替代方案全面实测
Jira 作为业界"老牌"项目管理工具,在不少公司仍被广泛使用,但随着团队对本土化.DevOps 兼容性以及易用性的要求不断提高,越来越多企业开始寻找适合自身的新一代项目管理工具. ...