归并排序的递归、非递归写法和随机快排的递归写法

2024-06-19 16:32

本文主要是介绍归并排序的递归、非递归写法和随机快排的递归写法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

归并排序

#include <bits/stdc++.h>
using namespace std;
void Merge(vector<int>& v, int L1, int R1, int L2, int R2)
{vector<int> tmp(R2 - L2 + R1 - L1 + 2);int i = L1, j = L2, index = 0;while (i <= R1 && j <= R2) {if (v[i] <= v[j])tmp[index++] = v[i++];elsetmp[index++] = v[j++];}while (i <= R1) tmp[index++] = v[i++];while (j <= R2) tmp[index++] = v[j++];// 放回v里面for (int i = 0; i < index; ++i) {v[L1 + i] = tmp[i];}
}
void MergeSort_1(vector<int>& v, int left, int right)
{if (left < right) {int mid = left + (right - left) / 2;MergeSort_1(v, left, mid);MergeSort_1(v, mid + 1, right);Merge(v, left, mid, mid + 1, right);for (auto& i : v) cout << i << " ";cout << endl;}
}
void MergeSort_2(vector<int>& v, int left, int right)
{for (int step = 2; step / 2 <= right - left; step *= 2) {for (int i = left; i <= right; i += step) {int mid = i + (step - 1) / 2;Merge(v, i, mid, mid + 1, min(right, i + step - 1));}for (auto& i : v) cout << i << " ";cout << endl;}
}
int main()
{vector<int> v = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};cout << "########    OriginArray    ########\n";for (auto& i : v) cout << i << " ";cout << "\n";cout << "########    MergeSort_1    ########\n";MergeSort_1(v, 0, v.size() - 1);cout << "########    MergeSort_2    ########\n";v = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};MergeSort_2(v, 0, v.size() - 1);
}

随机快排

#include <bits/stdc++.h>
using namespace std;
int RandPartition(vector<int>& A, int left, int right)
{// 生成[left,rihgt]区间内的随机数pint p = round(0.1 * rand() / RAND_MAX * (right - left) + left);std::swap(A[left], A[p]);int tmp = A[left];while (left < right) {// 注意下面两个while中的第一个条件,保证了所有数都大于或者小于主元时候不非法访问while (left < right && A[right] > tmp) --right;A[left] = A[right];while (left < right && A[left] <= tmp) ++left;A[right] = A[left];}// 退出时left==rightA[left] = tmp;return left;
}
void QuickSort(vector<int>& A, int left, int right)
{if (left < right) {  //当前区间长度大于1// 获取主元坐标int pos = RandPartition(A, left, right);// 区间通过主元坐标一分为二QuickSort(A, left, pos - 1);// 当 partition 过程使得主元左边的元素都小于主元时// 可以写成 QuickSort(A, left, pos);// 因为此时数组长度是单减的// 但 partition 过程使得主元左边的元素都小于等于主元时就不能这样写// 除此之外,也要保证主元不要每次都选到最右边的元素,否则也会死循环// 例如样例 {0,0} 会死循环,每次主元都是 1 位置上的元素。QuickSort(A, pos + 1, right);}
}
void QuickSort2(vector<int>& A, int left, int right)
{if (left >= right) return;int last = left;for (int i = left + 1; i <= right; ++i)if (A[i] < A[left])swap(A[++last], A[i]);swap(A[left], A[last]);QuickSort2(A, left, last - 1);QuickSort2(A, last + 1, right);
}
int main()
{srand((unsigned)time(NULL));vector<int> v = {0, 0};cout << "########    OriginArray    ########\n";for (auto& i : v) cout << i << " ";cout << "\n";cout << "#########    QuickSort    #########\n";QuickSort(v, 0, v.size() - 1);for (auto& i : v) cout << i << " ";cout << "\n";
}

这篇关于归并排序的递归、非递归写法和随机快排的递归写法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1075551

相关文章

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Python中lambda排序的六种方法

《Python中lambda排序的六种方法》本文主要介绍了Python中使用lambda函数进行排序的六种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1.对单个变量进行排序2. 对多个变量进行排序3. 降序排列4. 单独降序1.对单个变量进行排序

Python实现阶乘的四种写法

《Python实现阶乘的四种写法》本文主要介绍了Python实现阶乘的六种写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录第一种:推导式+循环遍历列表内每个元素相乘第二种:调用functools模块reduce的php累计

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会