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

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

相关文章

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

数据结构9——排序

一、冒泡排序 冒泡排序(Bubble Sort),顾名思义,就是指越小的元素会经由交换慢慢“浮”到数列的顶端。 算法原理 从左到右,依次比较相邻的元素大小,更大的元素交换到右边;从第一组相邻元素比较到最后一组相邻元素,这一步结束最后一个元素必然是参与比较的元素中最大的元素;按照大的居右原则,重新从左到后比较,前一轮中得到的最后一个元素不参4与比较,得出新一轮的最大元素;按照上述规则,每一轮结

七种排序方式总结

/*2018.01.23*A:YUAN*T:其中排序算法:冒泡排序,简单排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序*/#include <stdio.h>#include <math.h>#include <malloc.h>#define MAXSIZE 10000#define FALSE 0#define TRUE 1typedef struct {i

Linux中拷贝 cp命令中拷贝所有的写法详解

This text from: http://www.jb51.net/article/101641.htm 一、预备  cp就是拷贝,最简单的使用方式就是: cp oldfile newfile 但这样只能拷贝文件,不能拷贝目录,所以通常用: cp -r old/ new/ 那就会把old目录整个拷贝到new目录下。注意,不是把old目录里面的文件拷贝到new目录,

拓扑排序——C语言

拓扑排序(Topological Sorting)是一种用于有向无环图(DAG)的排序算法,其输出是图中所有顶点的线性排序,使得对于每条有向边 (u, v),顶点 u 在 v 之前出现。拓扑排序确定了项目网络图中的起始事件和终止事件,也就是顶点的执行顺序。         因为是有向无环图,所以拓扑排序的作用其实就是把先发生的排序在前面,后发生的排序到后面。 例如现在我们有一个

C++ 重建二叉树(递归方法)

/*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/#include <vector>class Solution {public:/*** 代码

嵌入式学习——数据结构(哈希、排序)——day50

1. 查找二叉树、搜索二叉树、平衡二叉树 2. 哈希表——人的身份证——哈希函数 3. 哈希冲突、哈希矛盾 4. 哈希代码 4.1 创建哈希表 4.2  5. 算法设计 5.1 正确性 5.2 可读性(高内聚、低耦合) 5.3 健壮性 5.4 高效率(时间复杂度)时间复杂度越低,效率越高, 5.5 低储存(空间复杂度)空间复杂度越低,存储空间越少 6.排序算法 6.1 冒

大学生自救数据结构与算法(py实现)——01递归

目录 目录 递归 基本概念 工作原理 基本要素 优点 缺点 实现技巧 实例解析:计算阶乘 斐波那契数列 高效的斐波那契数列 python中的最大递归深度 二分查找 基本原理 性能分析 优化与变体 线性递归  元素序列的递归求和 二路递归 二路递归的基本概念 典型应用 工作原理 多重递归  示例:计算卡特兰数(Catalan Number) 尾递

leetcode刷题(40)——83. 删除排序链表中的重复元素

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3->3 输出: 1->2->3 平时我们删除一个链表中的某个元素,一般都是以下的写法: temp.next = temp.next.next; 这样temp.next就被删除了 此题解法如下: class Solution

对递归执行过程的简单描述

1. 分析代码 #include <stdio.h>void fun(int n){printf("1th - Level: %d Address: %d\n", n, &n);if(n < 3)fun(n+1);printf("2th - Level: %d Address: %d\n", n, &n);}int main(){fun(1);return 0;} 输出结果为: