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

17zwd一起做网站广州成都好的网站设计公司

17zwd一起做网站广州,成都好的网站设计公司,企业推广app,找人做方案的网站文章目录 归并排序1.递归实现2.非递归实现3.海量数据的排序问题 归并排序 时间复杂度:O ( N * logzN ) 每一层都是N,有log2N层空间复杂度:O(N),每个区间都会申请内存,最后申请的数组大小和array大小相同稳定…

文章目录

  • 归并排序
        • 1.递归实现
        • 2.非递归实现
        • 3.海量数据的排序问题


归并排序


  • 时间复杂度:O ( N * logzN ) 每一层都是N,有log2N层
  • 空间复杂度:O(N),每个区间都会申请内存,最后申请的数组大小和array大小相同
  • 稳定性:稳定

目前为止,稳定的排序有:插入、冒泡、归并

  • 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,采用了分治法

在这里插入图片描述

  • 将待排序列分解,先使每个子序列有序,再使子序列段间有序
  • 将已有序的子序列合并,得到完全有序的序列
  • 若将两个有序表合并成一个有序表,称为二路归并
1.递归实现

在这里插入图片描述

  • 1.确定递归的结束条件,求出中间数mid,
  • 2.进行分解,根据mid来确定递归的区间大小
  • 3.递归分解完左边,然后递归分解右边
  • 4.左右分解完成后,进行合并
  • 5.申请新数组进行合并,比较两个数组段,记得查漏补缺
  • 6.和并的时候要对齐下标,每个tmp的下标要找到array中对应的下标
/*** 归并排序* @param array*/public static void mergeSort(int[] array) {mergeSortFunc(array,0,array.length-1);}private static void mergeSortFunc(int[] array, int left, int right) {//结束条件if (left >= right) {return;}//进行分解int mid = (left + right) / 2;mergeSortFunc(array, left, mid);mergeSortFunc(array, mid + 1, right);//左右分解完成后,进行合并merge(array, left, right, mid);}//进行合并private static void merge(int[] array, int start, int end, int mid) {int s1 = start;int s2 = mid + 1;int[] tmp = new int[end - start + 1];int k = 0;//k为tmp数组的下标while (s1 <= mid && s2 <= end) {//两个数组中都有数据//进行比较,放到新申请的数组if (array[s1] <= array[s2]) {tmp[k++] = array[s1++];} else {tmp[k++] = array[s2++];}}//因为有&&条件,数组不一定走完while (s1 <= mid) {tmp[k++] = array[s1++];}while (s2 <= end) {tmp[k++] = array[s2++];}//此时,将排好的tmp数组的数组,拷贝到arrayfor (int i = 0; i < tmp.length; i++) {array[i+start] = tmp[i];//对齐下标}}
2.非递归实现

在这里插入图片描述

  • 1.从1开始分组,先保证每个数都是独立有序的
  • 2.进行循环,i下标从0开始,每次跳转组数的两倍
  • 3.根据left = i,求出mid和right
  • 4.要避免mid和right越界
  • 5.分组进行合并
  • 6.二倍数扩大组数
/**** 归并排序,非递归实现* @param array*/public static void mergeSort2(int[] array) {int gap = 1;while (gap < array.length) {//i += gap * 2 i每次跳到下一组for (int i = 0; i < array.length; i += gap * 2) {int left = i;//要避免mid和right越界int mid = left + gap - 1;if(mid>=array.length){mid = array.length-1;//修正越界的情况}int right = mid + gap;if (right>=array.length){//修正越界的情况right = array.length-1;}merge(array,left,right,mid);//进行合并}gap *=2;//2倍数扩大组数}}//进行合并private static void merge(int[] array, int start, int end, int mid) {int s1 = start;int s2 = mid + 1;int[] tmp = new int[end - start + 1];int k = 0;//k为tmp数组的下标while (s1 <= mid && s2 <= end) {//两个数组中都有数据//进行比较,放到新申请的数组if (array[s1] <= array[s2]) {tmp[k++] = array[s1++];} else {tmp[k++] = array[s2++];}}//因为有&&条件,数组不一定走完while (s1 <= mid) {tmp[k++] = array[s1++];}while (s2 <= end) {tmp[k++] = array[s2++];}//此时,将排好的tmp数组的数组,拷贝到arrayfor (int i = 0; i < tmp.length; i++) {array[i + start] = tmp[i];//对齐下标}}
3.海量数据的排序问题

外部排序:排序过程需要在磁盘等外部存储进行的排序

前提:内存只有 1G,需要排序的数据有 100G

因为内存中因为无法把所有数据全部放下,所以需要外部排序,而归并排序是最常用的外部排序

  1. 先把文件切分成 200 份,每个 512 M
  2. 分别对 512 M 排序,因为内存已经可以放的下,所以任意排序方式都可以
  3. 进行 2路归并,同时对 200 份有序文件做归并过程,最终结果就有序了

点击移步博客主页,欢迎光临~

偷cyk的图

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

相关文章:

  • 广州建设银行保安招聘网站企业形象设计论文
  • 网站seo诊断中国乐清新闻
  • 响应式网站建设多少钱百度资源分享网
  • 天津高端网站建设关键词优化计划
  • jsp做视频网站成都市住房和城乡建设局官网查询
  • 河北省住房城乡建设厅网站wordpress dux缩略图
  • 开发网站的流程步骤前台网站系统源码
  • 购物网站建设规划书范文iis wordpress index.php
  • 怎么知道网站哪家公司做的建站国外百元服务器
  • 我要自学网网站建设与管理甜品网站建设项目规划书
  • 网站安全查询系统网页布局的设计步骤
  • 关于网站建设毕业答辩怎么说什么是网络营销?如何理解它的产生和把握它的特点?
  • 12306网站谁建设的摄影师常用的网站
  • 专业做室内设计的网站有哪些方面WordPress已安装主题
  • 网站免费建站中国建设银行网站首页e路护航
  • 网站开发案例详解下载浦城 网站 做
  • 网站后台设置关键字app投放推广
  • 上海网站备案信息html网页制作企业类网站
  • 帝国cms做网站怎样维护企业网站建设可分为什么层次
  • 惠阳开发网站建设网络营销主要干什么
  • 建站网站建设wordpress自动链接到图片
  • 021新手学做网站上海设计公司 快消品
  • 网站开发公司规章制度郑州网络推广培训
  • 温州集团网站建设公司百度收录入口提交查询
  • 常州做网站公司排名有哪些网站做生鲜到家
  • 开发一套网站系统 多少钱城乡建设学校网站
  • wordpress影视站主题上海seo外包
  • 厦门安能建设品牌网站建设ui设计工资
  • 企业网站开发效果北京网站开发哪家好
  • 用模板做网站会被盗吗wordpress 模版安装教程