在编程中,排序是基础且重要的操作。而C语言原地排序因其节省内存、效率高的特点,被广泛应用于嵌入式系统、操作系统内核等资源受限的场景。本文将带你从零开始,深入浅出地理解什么是原地排序,并手把手教你用 C 语言实现两种经典算法:冒泡排序和快速排序。
“原地排序”(In-place Sorting)是指排序过程中不需要额外的存储空间(或仅使用常数级别的额外空间),直接在原始数组上进行元素交换完成排序。这与“非原地排序”(如归并排序)需要额外数组形成鲜明对比。
冒泡排序通过重复遍历数组,比较相邻元素并交换位置,使较大(或较小)的元素“冒泡”到末尾。它是一种稳定的、时间复杂度为 O(n²) 的原地排序算法。
#include <stdio.h>void bubbleSort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { // 标记本轮是否发生交换 int swapped = 0; for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { // 交换元素 int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; swapped = 1; } } // 如果没有交换,说明已有序,提前退出 if (!swapped) break; }}int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(arr) / sizeof(arr[0]); printf("排序前: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } bubbleSort(arr, n); printf("\n排序后: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0;} 快速排序是分治思想的经典应用,平均时间复杂度为 O(n log n),是实际应用中最常用的排序之一。它通过选择一个“基准值”(pivot),将数组分为小于和大于基准的两部分,再递归排序。整个过程无需额外数组,是典型的快速排序C语言实现中的原地版本。
#include <stdio.h>// 分区函数:将数组分为小于和大于 pivot 的两部分int partition(int arr[], int low, int high) { int pivot = arr[high]; // 选择最后一个元素作为基准 int i = low - 1; // 小于 pivot 的区域边界 for (int j = low; j < high; j++) { if (arr[j] <= pivot) { i++; // 交换 arr[i] 和 arr[j] int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } // 将 pivot 放到正确位置 int temp = arr[i + 1]; arr[i + 1] = arr[high]; arr[high] = temp; return i + 1; // 返回 pivot 的索引}// 快速排序主函数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); // 排序右半部分 }}int main() { int arr[] = {10, 7, 8, 9, 1, 5}; int n = sizeof(arr) / sizeof(arr[0]); printf("排序前: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } quickSort(arr, 0, n - 1); printf("\n排序后: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0;} 通过本教程,你已经掌握了两种经典的C语言原地排序方法:简单直观的冒泡排序和高效实用的快速排序。它们都满足“原地”的要求,即只使用 O(1) 的额外空间。对于初学者,建议先理解冒泡排序的逻辑,再挑战快速排序的递归与分区思想。
记住,原地排序算法的核心在于“就地交换”,不依赖额外数组。掌握这些基础算法,不仅能提升你的 C 语言编程能力,也为学习更高级的数据结构和算法打下坚实基础。
现在,打开你的 IDE,动手敲一遍代码吧!实践是最好的老师。
本文由主机测评网于2025-12-08发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025124768.html