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;

}

相关推荐
赵民勇2 分钟前
systemd-sysusers命令详解
linux·运维
灿烂的贝壳3 分钟前
FC SAN多路径负载均衡配置指南
linux
余额瞒着我当琳5 分钟前
C++多态深入解析:多态概念,多态实现条件,虚函数表与内存分布,常见问题及注意事项
c++·算法
明德扬8 分钟前
AD9653单通道波形怎么看?幅度、频率与基础测量入门
学习·fpga开发·fpga
binqian10 分钟前
【Linux】内核怎么管理侦听socket
linux·网络协议
江湖人称菠萝包10 分钟前
【Windows】《深入浅出Windows API程序设计:核心编程篇》笔记-Chapter11-PE文件格式深入剖析
windows·笔记
维克兜率天13 分钟前
【维克】模块3总结:从一行空数据,到一个能跑的模型
python·深度学习·算法
j7~15 分钟前
【Linux网络】三十七.TCP 协议通讯流程
linux·网络编程·三次握手·四次挥手·tcp 协议通讯流程
飞Link17 分钟前
定积分理论与 Python 仿真完全指南
python·算法