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

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

相关文章

mybatis的mapper对应的xml写法及配置详解

《mybatis的mapper对应的xml写法及配置详解》这篇文章给大家介绍mybatis的mapper对应的xml写法及配置详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录前置mapper 对应 XML 基础配置mapper 对应 xml 复杂配置Mapper 中的相

Java List排序实例代码详解

《JavaList排序实例代码详解》:本文主要介绍JavaList排序的相关资料,Java排序方法包括自然排序、自定义排序、Lambda简化及多条件排序,实现灵活且代码简洁,文中通过代码介绍的... 目录一、自然排序二、自定义排序规则三、使用 Lambda 表达式简化 Comparator四、多条件排序五、

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

mysql递归查询语法WITH RECURSIVE的使用

《mysql递归查询语法WITHRECURSIVE的使用》本文主要介绍了mysql递归查询语法WITHRECURSIVE的使用,WITHRECURSIVE用于执行递归查询,特别适合处理层级结构或递归... 目录基本语法结构:关键部分解析:递归查询的工作流程:示例:员工与经理的层级关系解释:示例:树形结构的数

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

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.由快