C++ 快排、堆排、归并排序汇总
/快排、堆排、归并/
//快排
int partition(vector<int>& nums, int low, int high) {
//swap(nums[low], nums[(low + high) / 2]);
srand((unsigned int)time(NULL));
int pivPos = rand() % (high - low + 1) + low;//随机产生[low,high)作为基准
swap(nums[low], nums[pivPos]);
int pivot = nums[low];
while (low < high) {
while (low < high && nums[high] >= pivot) {
--high;
}
nums[low] = nums[high];
while (low < high && nums[low] <= pivot) {
++low;
}
nums[high] = nums[low];
}
nums[low] = pivot;
return low;
}
void quickSort(vector<int>& nums,int low,int high) {
if (low < high) {
int pivot = partition(nums, low, high);
quickSort(nums, low, pivot - 1);
quickSort(nums, pivot + 1, high);
}
return;
}
//堆排序
void buildHeap(vector<int>& a, int root, int len) {
int lchild = root * 2 + 1;
if (lchild < len) {
int maxIdx = lchild;
int rchild = lchild + 1;
if (rchild < len) {
if (a[rchild] > a[maxIdx]) {
maxIdx = rchild;//保存左右节点较大值的下标
}
}
if (a[root] < a[maxIdx]) {
swap(a[root], a[maxIdx]);//交换父节点和最大子节点
buildHeap(a, maxIdx, len);//从最大子节点处递归建堆
}
}
}
void heapSort(vector<int>& a, int len) {
//初始化,i 从最后一个父节点开始调整
for (int i = len / 2 - 1; i >= 0; i--) {
buildHeap(a, i, len);
}
//将堆顶元素(最大值)和数组最后一个元素交换,再重新调整堆
for (int i = len - 1; i > 0; i--) {
swap(a[0], a[i]);
buildHeap(a, 0, i);//去除最后位置元素后重新建堆,此时数组长度为 i
}
}
//归并排序
void merge(vector<int>& arr, int low, int mid, int high) {
//i 指向第一个有序区的第一个元素, j 指向第二有序区的第一个元素
int i = low, j = mid + 1, k = 0;
int* temp = new int[high - low + 1];//temp数组暂存合并的有序序列
while (i <= mid && j <= high) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
}
else {
temp[k++] = arr[j++];
}
}
while (i <= mid) {//若比较完之后,第一个有序区仍有剩余,则直接复制到t数组中
temp[k++] = arr[i++];
}
while (j <= high) {
temp[k++] = arr[j++];
}
for (i = low, k = 0; i <= high; i++, k++) {//将排好序的存回arr中low到high这区间
arr[i] = temp[k];
}
delete []temp;
}
void mergeSort(vector<int>& arr, int low, int high) {
if (low < high) {
int mid = (high - low) / 2 + low;
mergeSort(arr, low, mid);
mergeSort(arr, mid+1, high);
merge(arr, low, mid, high);
}
}
int main() {
vector<int> nums = { 5,2,8,1 ,3,2,6};
//quickSort(nums, 0, nums.size() - 1);
//heapSort(nums, nums.size());
mergeSort(nums, 0, nums.size() - 1);
for (int i = 0; i < nums.size(); i++) {
cout << nums[i] << " ";
}
cout << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人