Unity中的快速排序算法 & 二分查找
一、快速排序介绍
快速排序(Quick Sort)是由东尼·霍尔(Tony Hoare)所发展的一种排序算法。在平均情况下,对 n 个项目进行排序需要 $O(n log n)$ 次比较。在最坏情况下,需要 $O(n^2)$ 次比较,但这种最坏情况并不常见。实际上,快速排序通常明显比其他 $O(n log n)$ 时间复杂度的算法更快。这是因为它的内部循环(inner loop)可以在大多数架构上高效地实现,并且对于大多数现实世界的数据,通过合理设计基准元素的选择,可以减少出现二次方时间复杂度的可能性。
快速排序的步骤
- 选择基准元素:从数列中挑选出一个元素,将其称为 “基准”(pivot)。
- 分区操作:重新排列数列,使得所有比基准值小的元素都摆放在基准的前面,所有比基准值大的元素都摆在基准的后面(相同的数可以放在任意一边)。在这个分区操作完成之后,该基准元素就处于数列的中间位置。
- 递归排序:递归地(recursive)对小于基准值元素的子数列和大于基准值元素的子数列进行排序。
以下为示例代码(这里假设使用某种类 C 语言风格来展示快速排序算法的核心逻辑,并非实际 Unity 代码,但可以在 Unity 中按此思路实现):
#include <stdio.h>
// 分区函数
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
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);
}
}
// 打印数组函数
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++)
printf("%d ", arr[i]);
printf("\n");
}
// 主函数
int main() {
int arr[] = {10, 7, 8, 9, 1, 5};
int n = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, n - 1);
printf("Sorted array: \n");
printArray(arr, n);
return 0;
}
在上述代码中,partition 函数实现了分区操作,quickSort 函数通过递归调用自身来完成整个排序过程。最后在 main 函数中对一个示例数组进行排序并打印排序结果。
复杂度分析
- 时间复杂度:
- 平均情况:$O(n log n)$
- 最坏情况:$O(n^2)$
- 空间复杂度:$O(log n)$(递归调用栈的空间)
快速排序是一种分治算法,它将一个大问题分解为多个小问题,通过解决小问题来解决大问题,这种思想在很多算法中都有应用。在 Unity 开发中,如果需要对大量数据进行排序,快速排序是一个不错的选择,但需要注意避免最坏情况的发生。