c语言学习笔记:排序与查找方法整理

排序与查找是c语言中非常重要的算法,今天复习后,整理了一些相关的知识点。

一、排序

1、选择排序:每轮选出最小元素,放到已排序区间末尾

时间复杂度:O(n²)

空间复杂度:O(1) 不稳定

void selectionSort(int arr\[\], int n) {

for (int i = 0; i < n - 1; i++) {

int minIndex = i;

for (int j = i + 1; j < n; j++) {

if (arrj < arrminIndex) {

minIndex = j;

}

}

if (minIndex != i) {

swap(&arri, &arrminIndex);

}

}

}

2、冒泡排序:相邻元素两两比较,大的往后"冒泡"

时间复杂度:O(n²)

空间复杂度:O(1) 稳定

void bubbleSort(int arr\[\], int n) {

for (int i = 0; i < n - 1; i++) {

int swapped = 0; // 优化:本轮是否发生交换

for (int j = 0; j < n - 1 - i; j++) {

if (arrj > arrj + 1) {

swap(&arrj, &arrj + 1);

swapped = 1;

}

}

if (!swapped) break; // 没有交换说明已有序

}

}

3、插入排序:将未排序元素插入到已排序区间的合适位置

时间复杂度:O(n²)

空间复杂度:O(1) 稳定

void insertionSort(int arr\[\], int n) {

for (int i = 1; i < n; i++) {

int key = arri;

int j = i - 1;

while (j >= 0 && arrj > key) {

arrj + 1 = arrj;

j--;

}

arrj + 1 = key;

}

}

4、快速排序:选基准,分区,递归排序左右子数组

时间复杂度:平均 O(nlogn),最坏 O(n²)

空间复杂度:O(logn) 不稳定

int partition(int arr\[\], int low, int high) {

int pivot = arrhigh; // 取最后一个元素为基准

int i = low - 1; // 小于基准的区域边界

for (int j = low; j < high; j++) {

if (arrj < pivot) {

i++;

swap(&arri, &arrj);

}

}

swap(&arri + 1, &arrhigh);

return i + 1;

}

void quickSort(int arr\[\], int low, int high) {

if (low < high) {

int pi = partition(arr, low, high);

quickSort(arr, low, pi - 1);

quickSort(arr, pi + 1, high);

}

}

二、查找

二分查找:在有序数组中查找目标值

时间复杂度:O(logn) 空间复杂度:O(1)

返回目标下标,未找到返回 -1

int binarySearch(int arr\[\], int n, int target) {

int left = 0;

int right = n - 1;

while (left <= right) {

int mid = left + (right - left) / 2; // 防止溢出

if (arrmid == target) {

return mid;

} else if (arrmid < target) {

left = mid + 1;

} else {

right = mid - 1;

}

}

return -1;

}

相关推荐
Logic1019 小时前
C语言/数据结构动态规划题解:爬楼梯(含坏台阶)——避开障碍物的路径计数
c语言·数据结构·动态规划·时间复杂度·空间复杂度·算法题·爬楼梯
海绵宝宝转agent9 小时前
Pico 学习笔记 Harness 设计、历史压缩、三类目录与缓存复用
笔记·学习·缓存
Starry-sky(jing)9 小时前
watchdog: BUG: soft lockup - CPU#3 stuck for 22s! 怎么排查——从寄存器 dump 到自旋锁争用根因
linux·内核·服务器运维·soft lockup·性能排查
胡家伟++9 小时前
我用 48 轮 AI 思维链做了一次研究战略推演:从“验证信号危机“到“验证栈“统一框架
人工智能·算法
山下梅子酒2259 小时前
洛谷-入门-B2081
c语言
DongQiShanRen9 小时前
裁决台账双向互校(上):名册与实物的第一道对账
java·linux·运维·数据库·人工智能·自然语言处理·数据挖掘
ShineWinsu9 小时前
对于Redis:AOF持久化的解析
linux·数据库·redis·缓存·面试·持久化·aof
朝朝辞暮i9 小时前
C++ 第 39 章: 阶段性总复习——类、对象、构造、继承、this、指针与智能指针
开发语言·c++·算法·ros2
wuminyu9 小时前
Virtual Thread重投递至ForkJoinPool任务队列过程解析
java·linux·c语言·jvm·c++
xuhe29 小时前
Codex解决新模型无法使用/model选择的问题
linux·ai·codex