归并排序
// 归并排序 - 合并两个有序数组
void merge(vector<int>& arr, int l, int mid, int r) {// 创建临时数组存储合并结果vector<int> temp(r - l + 1);int i = l, j = mid + 1, k = 0;// 比较左右两部分的元素,按序放入临时数组while(i <= mid && j <= r) {if(arr[i] <= arr[j]) {temp[k++] = arr[i++]; // 左半部分元素较小} else {temp[k++] = arr[j++]; // 右半部分元素较小}}// 将左半部分剩余元素放入临时数组while(i <= mid) temp[k++] = arr[i++];// 将右半部分剩余元素放入临时数组while(j <= r) temp[k++] = arr[j++];// 将临时数组中的元素复制回原数组for(int i = 0; i < k; i++) {arr[l + i] = temp[i];}
}// 归并排序的递归实现
void mergeSort(vector<int>& arr, int l, int r) {if(l >= r) return; // 递归终止条件:区间长度为1int mid = l + (r - l >> 1); // 计算中点,防止溢出mergeSort(arr, l, mid); // 递归排序左半部分mergeSort(arr, mid + 1, r); // 递归排序右半部分merge(arr, l, mid, r); // 合并两个有序数组
}
快速排序
void quickSort(vector<int>& arr, int l, int r) {if(l >= r) return;int x = arr[l + (r - l >> 1)];int i = l, j = r;while(i < j) {while(arr[i] < x) i++;while(arr[j] > x) j--;if(i < j) swap(arr[i], arr[j]);}quickSort(arr, l, j);quickSort(arr, j + 1, r);
}
// 快速排序的分区函数
// 将数组按照基准值分为两部分,返回分区点位置
int partition(vector<int>& arr, int l, int r) {int x = arr[l + (r - l >> 1)]; // 选择中间位置的元素作为基准值int i = l, j = r; // 双指针,从两端向中间移动while(i < j) {while(arr[i] < x) i++; // 找到左边第一个大于等于基准值的元素while(arr[j] > x) j--; // 找到右边第一个小于等于基准值的元素if(i < j) swap(arr[i], arr[j]); // 交换这两个元素}return j; // 返回分区点位置
}// 快速排序的主函数
// 通过分治的方式递归排序数组
void quickSort(vector<int>& arr, int l, int r) {if(l >= r) return; // 递归终止条件:区间长度为1int x = partition(arr, l, r); // 获取分区点quickSort(arr, l, x - 1); // 递归排序左半部分quickSort(arr, x + 1, r); // 递归排序右半部分
}