排序与查找是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;
}