你有没有遇到过这种情况:往U盘里拷了几十个文件,名字乱七八糟,找起来头大。插到电脑上,按名称排序还得等几秒才排好。其实背后可能就藏着一个叫‘递归排序’的小能手在默默干活。
什么是递归排序?
简单说,递归就是自己调用自己。比如你想把一堆杂乱的文件夹理清楚,先分大类,每个大类再细分,每一层都用同样的方法整理——这思路就跟递归排序一模一样。
拿归并排序举个例
归并排序是典型的递归排序算法。它先把数组从中间劈成两半,然后对每一半继续劈,直到只剩一个元素,再两两合并,边合并边排序。
void mergeSort(int arr[], int left, int right) {
if (left >= right) return;
int mid = (left + right) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
你看,mergeSort 函数里面又调用了自己,这就是递归的核心。就像你整理书架,先分上下两层,每层再各自整理,最后合在一起,整整齐齐。
递归和外设也有关系?
别觉得这玩意儿只在代码里打转。现在很多带固态存储的外设,比如高端移动硬盘或USB闪存盘,内置的固件在处理大量小文件时,也会用类似策略加快读取响应。尤其是需要按时间、大小排序文件列表的时候,设备本身就得快速算出顺序,这时候递归算法效率高,省时间。
下次你插上一个反应贼快的U盘,点一下“按名称排序”瞬间完成,背后说不定就是归并排序或者快速排序在跑,而它们都靠递归撑着。
快速排序也递归
快速排序也是常用递归排序,选一个基准值,把数组分成比它大和比它小的两部分,然后再对这两部分重复操作。
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);
}
}
这个 quickSort 同样调用了自己,一层层深入,直到每个区间只剩一个数。
虽然我们买外设不直接看算法,但那些读写速度快、管理文件顺滑的设备,往往背后软硬件结合得好,基础算法也用得巧。