四、快速排序(递归版)
原理:分治思想,选基准值分区,递归排序。
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 partition(int arr[], int low, int high) {
int pivot = arr[high], i = low-1, j, temp;
for (j = low; j < high; j++) {
if (arr[j] <= pivot) { // 升序,降序改 >=
i++;
temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;
}
}
temp = arr[i+1]; arr[i+1] = arr[high]; arr[high] = temp;
return i+1; // 基准位置
}
五、归并排序(递归版)
原理:分治+合并,先拆分再合并有序子数组。
void merge(int arr[], int l, int m, int r) {
int n1 = m - l + 1, n2 = r - m;
int L[n1], R[n2], i, j, k;
for (i=0; i for (j=0; j i = j = 0; k = l; while (i < n1 && j < n2) // 合并有序数组 arr[k++] = (L[i] <= R[j]) ? L[i++] : R[j++]; // 升序,降序改 >= while (i < n1) arr[k++] = L[i++]; while (j < n2) arr[k++] = R[j++]; } void mergeSort(int arr[], int l, int r) { if (l < r) { int m = l + (r-l)/2; mergeSort(arr, l, m); mergeSort(arr, m+1, r); merge(arr, l, m, r); } } 六、堆排序 原理:构建大顶堆(或小顶堆),逐个取出堆顶元素。 void heapify(int arr[], int n, int i) { int largest = i, left = 2*i+1, right = 2*i+2, temp; if (left < n && arr[left] > arr[largest]) largest = left; // 大顶堆,小顶堆改 < if (right < n && arr[right] > arr[largest]) largest = right; if (largest != i) { temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp; heapify(arr, n, largest); // 递归调整子堆 } } void heapSort(int arr[], int n) { int i, temp; // 构建大顶堆(从最后一个非叶子节点开始) for (i = n/2 - 1; i >= 0; i--) heapify(arr, n, i); // 逐个提取堆顶元素 for (i = n-1; i > 0; i--) { temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; // 交换堆顶和末尾 heapify(arr, i, 0); // 调整剩余元素为堆 } }