🔷 快速排序 (Quick Sort)
-
特点:
- 划分与治理的策略。
- 通过选择一个“枢轴”元素来对数组进行分区,使得较小的元素在左侧,较大的元素在右侧。
-
优点:
- 平均和最佳情况下的时间复杂度为 (O(n \log n))。
- 在实际排序中通常比其他算法更快。
- 可以在原地排序,不需要额外的存储空间。
-
缺点:
- 最坏情况下的时间复杂度为 (O(n^2))。
- 枢轴的选择和数组的初始顺序对性能有影响。
示例:
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);
}
}
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j < high; 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;
}
🔷 归并排序 (Merge Sort)
-
特点:
- 分治策略。
- 将数组分为两半,对每半进行排序,然后合并结果。
-
优点:
- 时间复杂度始终为 (O(n \log n))。
- 稳定排序。
-
缺点:
- 需要额外的存储空间 (O(n))。
- 对于小列表,其他算法如插入排序可能更快。
示例:
void mergeSort(int arr[], int l, int r) {
if (l < r) {
int m = (l + r) / 2;
mergeSort(arr, l, m);
mergeSort(arr, m + 1, r);
merge(arr, l, m, r);
}
}
void merge(int arr[], int l, int m, int r) {
int n1 = m - l + 1;
int n2 = r - m;
int L[] = new int[n1];
int R[] = new int[n2];
for (int i = 0; i < n1; ++i) {
L[i] = arr[l + i];
}
for (int j = 0; j < n2; ++j) {
R[j] = arr[m + 1 + j];
}
int i = 0, j = 0, k = l;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
} else {
arr[k] = R[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
🔷 Tower of Hanoi
-
特点:
- 经典的递归问题。
- 包括三个塔和一堆大小不同的盘子,目标是将所有盘子从一个塔移动到另一个塔,同时每次只能移动顶部的盘子,并且不允许放置较大的盘子在较小的盘子上。
-
优点:
- 通过递归提供了清晰的解决方案。
-
缺点:
- 时间复杂度为 (O(2^n))。
示例:
void towerOfHanoi(int n, char from_rod, char to_rod, char aux_rod) {
if (n == 1) {
System.out.println("Move disk 1 from rod " + from_rod + " to rod " + to_rod);
return;
}
towerOfHanoi(n - 1, from_rod, aux_rod, to_rod);
System.out.println("Move disk " + n + " from rod " + from_rod + " to rod " + to_rod);
towerOfHanoi(n - 1, aux_rod, to_rod, from_rod);
}
⚠️ 注意: Tower of Hanoi是一个用于理解递归概念的经典问题。