【大话数据结构算法】归并排序
归并排序算法的基本步骤:
1、把0~length-1的数组分成左数组和右数组;
2、对左数组和右数组进行迭代排序;
3、将左数组和右数组进行合并,那么生成的整个数组就是有序的数据数组。
归并排序基本算法实现如下:
void _merge_data_in_array(int[] array, int start,int middle,int end){int[] mergeArray = null;int left = start;int right = end;int m = middle;int mid = middle + 1;int k = 0;while(left <= m && mid <= right){if(array[left] < array[mid]){mergeArray[k++] = array[left++];} else{mergeArray[k++] = array[mid++];}}while(left <= m){mergeArray[k++] = array[left++];}while(mid <= right){mergeArray[k++] = array[mid++];}for(int i = 0;i < k;i++){array[start + i] = mergeArray[i];}}
java代码实现如下:
public class Merge_Sort {public static void main(String[] args) {int[] array = {4,9,2,3,6,0,7,1,5};merge_sort(array,8);for (int i = 0; i < array.length; i++) {System. out.println(array[i]);}}//判断参数合法性,调用合并函数进行迭代操作public static void merge_sort(int[] array, int length){if(null == array && 0 == length){return;}_merge_sort(array,0,length - 1);}//进行迭代操作public static void _merge_sort(int[] array, int start,int end){while(start < end){int middle = start + ((end -start) >> 1);//求middle,没看懂
// int middle = (start + end) / 2;//对左数组进行迭代排序_merge_sort(array,start,middle);//对右数组进行迭代排序_merge_sort(array,middle + 1,end);//将迭代排序后的左数组和右数组进行合并_merge_data_in_array(array,start,middle,end);}}//对合并后的队列进行合并操作public static void _merge_data_in_array(int[] array, int start,int middle,int end){int[] mergeArray = null;int left = start;int right = end;int m = middle;int mid = middle + 1;int k = 0;while(left <= m && mid <= right){if(array[left] < array[mid]){mergeArray[k++] = array[left++];} else{mergeArray[k++] = array[mid++];}}while(left <= m){mergeArray[k++] = array[left++];}while(mid <= right){mergeArray[k++] = array[mid++];}for(int i = 0;i < k;i++){array[start + i] = mergeArray[i];}}}
时间复杂度:
归并排序中可选区merge()函数内的“归并排序”作为基本操作。merge()函数的作用是将两个有序的序列归并为一个整体有序的序列。“归并操作”即为将待归并表中的元素复制到一个存储归并结果的表中的过程。在顺序表中,merge()函数的“归并操作”执行次数为要归并的两个子序列中元素个数之和。归并排序的时间复杂度和初始序列无关,平均情况下为O(nlogn){以2为底},最好情况下为O(nlogn){以2为底},最坏情况下为O(nlogn){以2为底}。
空间复杂度:
因为归并排序需要转存整个待排序列,因此空间复杂度为O(n)。
【大话数据结构算法】归并排序相关推荐
- 大话数据结构——算法
算法:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作. 为什么把数据结构和算法一起说? 想想罗密欧与朱丽叶,梁山伯和祝英台,少了一个你总会觉得奇怪吧. ...
- 【大话数据结构算法】查找算法
顺序查找 针对无序序列的一种最简单的查找方式. 算法思想: 从表中第一个记录开始,逐个与给定值进行比较,若某个记录的关键字和给定值相等,则查找成功:反之,若直到最后一个记录,其关键字和给定值都不相等, ...
- 【大话数据结构算法】直接选择排序
选择类排序的主要动作是"选择",直接选择排序采用最简单的选择方式,从头至尾顺序扫描序列,找出最小的一个记录,和第一个记录交换,接着从剩下的记录中继续这种选择和交换,最终使序列有序. ...
- 【大话数据结构算法】直接插入排序
直接插入排序的基本思想:每趟将一个待排元素作为关键字,按照其关键字值得大小插入到已经排好序的部分序列的适当位置,直到插入完成. 算法思想总结如下:(设待排序的数组为a[0-n-1]) 1.初始时,a[ ...
- 【大话数据结构算法】希尔排序
希尔排序的实质就是分组插入排序,该方法又称为缩小增量排序. 直接插入排序适合于序列基本有序的情况,希尔排序的每趟排序都会使整个序列变得更加有序,等整个序列基本有序了,再来一趟直接插入排序,这样会使排序 ...
- 【大话数据结构算法】冒泡排序
起泡排序又称为冒泡排序.它是通过一系列的"交换"动作完成的.首先将第一和第二个记录进行比较,如果第一个记录大于第二个记录,则两者交换位置,否则保持原位置不变:然后比较第二和第三个记 ...
- 【大话数据结构算法】快速排序算法
快速排序是交换类的排序,比如在站队的时候,老师说:"第一个同学出列,其他同学以第一个同学为中心,比他矮的全排在左边,比他高的全排在右边."这就是一趟快速排序.可以看出,一趟快速排序 ...
- 【大话数据结构算法】哈夫曼树
哈夫曼树又称为最优二叉树. 1.路径和路径长度 在一棵树中,从一个节点往下可以达到的孩子或者子孙节点之间的通路称为路径.通路中分支的数目称为路径长度.若规定根节点的层数为1,则从根节点 到第L层节点的 ...
- 大话数据结构及JAVA数据结构阅读笔记
目录 一.大话数据结构随书阅读笔记 第一章 数据结构概述 第二章 算法概述 第三章 线性表 第四章 栈与队列 第五章 串 第六章 树 第七章 图 第八章 查找 第九章 排序 二.大话数据结构思维导图 ...
最新文章
- ArrayList的内存泄露
- Spring MVC集成slf4j-logback - 我想跟代码谈谈 - 博客频道 - CSDN.NET
- java Date.getTime()返回负数异常情况分析
- 2016年计算机视觉和图像处理相关的国际会议一览表
- 计算广告学(Computational Advertising)CA
- (十三)其他设计模式
- el-table中合并行加入图标
- 使用Lucene的新FreeTextSuggester查找长尾建议
- 自定义控件_VIewPager显示多个Item
- 【Redis3】基于Redis sentinel的自动failover主从复制
- PHP获取git提交信意_代码提交规范检查与修复 php_codesniffer + composer-git-hooks
- 验证服务器的通用性,通用VNFM部署的可行性分析与验证
- 安卓系统修改开机LOGO
- WAP1 X/WAP2 0以及WAP浏览器的协议版本
- 英特尔核显驱动hd630_hd630相当于什么显卡
- 开发游戏引擎需要具备什么
- drupal 8 php filter,Drupal 7 与 Drupal 8 的一些变化
- Detecting Novel Associations in Large Data Sets(检测 大型数据集中的信息关联性,数据相关性)
- [转载] 网络游戏程序员须知 调试多人联机游戏
- div和div之间画横线_HTML在两个div标签中间画一条竖线的方法