当前位置: 首页 > news >正文

网站文章发布时间西宁软件网站建设

网站文章发布时间,西宁软件网站建设,淘客手机网站建设,如何选择做网站的公司在此之前我们已经介绍过归并排序和快速排序:浅谈归并排序与快速排序,但其中的实现都是基于递归的。本文将重新温故这两种算法并给出基于迭代的实现。 目录 1. 归并排序1.1 基于递归1.2 基于迭代 2. 快速排序2.1 基于递归2.2 基于迭代 1. 归并排序 1.1 基…

在此之前我们已经介绍过归并排序和快速排序:浅谈归并排序与快速排序,但其中的实现都是基于递归的。本文将重新温故这两种算法并给出基于迭代的实现。

目录

  • 1. 归并排序
    • 1.1 基于递归
    • 1.2 基于迭代
  • 2. 快速排序
    • 2.1 基于递归
    • 2.2 基于迭代

1. 归并排序

1.1 基于递归

归并排序的核心是二路归并,实现二路归并需要一个额外的辅助数组,因此空间复杂度是 O ( n ) O(n) O(n)

void merge(vector<int>& a, int l, int mid, int r, vector<int>& tmp) {int i = l, j = mid + 1, k = l;while (i <= mid && j <= r) {if (a[i] <= a[j]) tmp[k++] = a[i++];else tmp[k++] = a[j++];}while (i <= mid) tmp[k++] = a[i++];while (j <= r) tmp[k++] = a[j++];for (int i = l; i <= r; i++) a[i] = tmp[i];
}

该函数会对数组 a[l, mid][mid + 1, r] 两部分进行二路归并,其中辅助数组 tmp 的大小与 a 相同。

有了 merge 函数,我们就可以很方便的实现归并排序了:

void merge_sort(vector<int>& a, int l, int r, vector<int>& tmp) {if (l >= r) return;int mid = l + r >> 1;merge_sort(a, l, mid, tmp), merge_sort(a, mid + 1, r, tmp);merge(a, l, mid, r, tmp);
}

1.2 基于迭代

很明显,基于递归的实现是自顶向下的,而基于迭代的实现是自底向上的。

我们可以先枚举区间长度,再枚举区间左端点。一开始每个区间的长度是 1 1 1,我们每次对相邻的两个区间进行二路归并,每归并一次区间的长度就是原先的两倍,所以枚举区间长度时变量 len 的更新方式为 len *= 2

对于区间左端点,每合并完两个区间后,左端点就要更新成下下个区间,如下图所示:

还需保证 mid < n - 1,即 l < n - len

void merge_sort(vector<int>& a) {int n = a.size();vector<int> tmp(n);for (int len = 1; len < n; len *= 2) {for (int l = 0; l < n - len; l += 2 * len) {int mid = l + len - 1;int r = min(l + 2 * len - 1, n - 1);merge(a, l, mid, r, tmp);}}
}

归并排序的时间复杂度是 O ( n log ⁡ n ) O(n\log n) O(nlogn),无论是递归还是迭代,空间复杂度都是 O ( n ) O(n) O(n)

2. 快速排序

2.1 基于递归

void quick_sort(vector<int>& a, int l, int r) {if (l >= r) return;int mid = l + r >> 1;int i = l - 1, j = r + 1, x = a[mid];while (i < j) {while (a[++i] < x);while (a[--j] > x);if (i < j) swap(a[i], a[j]);}quick_sort(a, l, j), quick_sort(a, j + 1, r);
}

2.2 基于迭代

void quick_sort(vector<int>& a, int l, int r) {if (l >= r) return;stack<pair<int, int>> stk;stk.emplace(l, r);while (!stk.empty()) {auto [l, r] = stk.top();stk.pop();if (l < r) {int mid = l + r >> 1;int i = l - 1, j = r + 1, x = a[mid];while (i < j) {while (a[++i] < x);while (a[--j] > x);if (i < j) swap(a[i], a[j]);}stk.emplace(l, j);stk.emplace(j + 1, r);}}
}

时间复杂度是 O ( n log ⁡ n ) O(n\log n) O(nlogn),空间复杂度是 O ( log ⁡ n ) O(\log n) O(logn)

http://www.yayakq.cn/news/740121/

相关文章:

  • 做网站的公司天津国内vps
  • 黄页大全18勿看2000网站烟台百度网站建设推广
  • 英文网站建设比较好wordpress模板 知乎
  • 商城网站模板免费深圳建设注册中心网站
  • 网站开发 文献综述石家庄seo外包的公司
  • 建设银行网站怎么查工资明细wordpress模板创建
  • 上海最好网站建设公司淘宝销售书网站建设方案
  • 建设网站模板下载论坛网站需要多大的空间
  • 贵阳网站建设费用多少网帮你网站框架设计
  • 网站设计哪家口碑好青岛网站建设seo优化制作设计
  • 济南网站网站建设网站建设树状图
  • 设置 wap网站网站制作外包价格
  • 手机禁止网站跳转页面模板网站建设价格
  • 山东饰品行业网站制作网站开发用哪个软件方便
  • 中小企业网站的主流类型是wordpress注册跳过邮箱验证
  • 网站前端和后台wordpress插件代码
  • wordpress打开最快的网站北京汽车网站建设
  • 网站建设要注意哪些改成 响应式 网站
  • 模板网站的缺陷张家港做网站
  • 网站建设规划方案.pptasp.net网站建设论文
  • 建设网站的工作步骤是商务网站建设实训总结
  • 阜阳交通建设工程质监局网站网站建设流程教案
  • 广东一站式网站建设推荐浙江省建筑考证服务平台
  • 在电脑上建设个人网站光谷软件园 网站建设
  • 旅游网站建设国内外现状机械设备上哪个网站做外贸推广
  • 怎么做微信辅助的网站如何做影视网站的标题
  • 网站seo优化排名wordpress 图片路径加密
  • 大连做企业网站的公司嘉兴seo外包公司
  • 网站搜索框如何做中国源码网游戏开服
  • 科技制作网站wordpress动态