常见的排序方式有哪些?
在写程序或者处理数据时,排序几乎是绕不开的操作。比如你在网上购物,想按价格从低到高看商品;或者整理通讯录,让名字按字母顺序排列——这些背后都是排序在起作用。了解几种常见的排序方式,对理解软件如何工作很有帮助。
冒泡排序:最直观的入门算法
冒泡排序就像排队做操,相邻两人比身高,高的往后站。每一轮都把最大的数“冒”到最后。虽然效率不高,但逻辑简单,适合初学者理解排序的基本思想。
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
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;
}
}
}
}选择排序:每次找最小值
选择排序的思路很直接:在未排序的部分里找出最小的数,放到已排序部分的末尾。它不像冒泡那样频繁交换,而是每轮只交换一次,节省了一些操作。
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 (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// 将最小值与当前位置交换
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}插入排序:像整理扑克牌
打过扑克的人可能有这种习惯:抓一张牌就把它插进手里已经排好序的位置。插入排序就是这个思路。对于小规模数据或接近有序的数据,它的表现不错,很多高级排序算法在数据量小时也会退化成它。
快速排序:分治法的典型应用
快速排序的核心是“选基准、分两边”。比如选一个数作为基准,把比它小的放左边,大的放右边,然后对左右两部分递归处理。平均情况下速度很快,是实际应用中最常用的排序之一。
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pivot = partition(arr, low, high);
quickSort(arr, low, pivot - 1);
quickSort(arr, pivot + 1, high);
}
}归并排序:稳定且高效
归并排序也是分治思想,但它先拆分再合并。不管原始数据怎么乱,它都能保持稳定的性能,适合对稳定性要求高的场景,比如数据库查询结果排序。
现代编程语言大多内置了高效的排序函数,比如 C++ 的 sort()、Python 的 sorted(),它们底层通常结合了多种算法的优点。但知道这些基本排序方式,能帮你写出更合理的代码,也能在调试和优化时更快定位问题。