归并排序

排序算法五:归并排序

江枫思渺然 提交于 2020-02-28 23:19:59
效率仅次于快排的一种排序算法, 一般用于对总体无序,但是各子项相对有序的数列 思想: 采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序 平均时间复杂度为 nlog2n ,空间复杂度为n,稳定 public class Merge { /** * 对数组进行排序 * @param arr:要排序的数组 * @param left:数组的开始下标 * @param right:数组的终止下标 */ public void sort ( int [ ] arr , int left , int right ) { if ( left == right ) return ; int mid = ( left + right ) / 2 ; //记录中间位置下标,将数组分成两半 sort ( arr , left , mid ) ; //左边排序 sort ( arr , mid + 1 , right ) ; //右边排序 merge ( arr , left , mid + 1 , right ) ; } /** *归并排序 * @param arr:要排序的数组 * @param leftptr:排序的左指针 * @param rightptr:排序的右指针 * @param bound:边界 */ public

归并排序

淺唱寂寞╮ 提交于 2020-02-27 10:50:55
时间复杂度O(nlogn),但是空间复杂度O(n). 算法 递归的将前半部分数据和后半部分数据各自归并排序 1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。 2.设定两个指针left[0]和right[0],最初位置分别为两个已经排序序列的起始位置。 3.比较两个指针所指向的元素,选择相对小的元素pop出来,append到合并空间,并移动指针到下一位置(因为用了pop函数,所以下一位置是新的left[0或right[0]). 4.重复步骤 3 直到某一指针达到序列尾,将另一序列剩下的所有元素直接复制到合并序列尾。 算法分析 采用了经典的 分治策略 ,它将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段解得的各个答案修补到一起。 图解 代码 这里我们定义两个函数,一个用于递归的进行排序,另一个用于合并两个已经排序的部分。 import math #用到math.floor函数 向下取整 def mergesort ( arr ) : #递归的拆分排序 if len ( arr ) < 2 : return arr mid = math . floor ( len ( arr ) / 2 ) left = arr [ 0 : mid ] right = arr [ mid : ] a = mergesort ( left ) b = mergesort

Java实现的5大排序算法

会有一股神秘感。 提交于 2020-02-27 06:48:12
Java实现的5大排序算法 排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料。 废话不多说,下面逐一看看经典的排序算法: 1、Java排序算法之选择排序 选择排序的基本思想是遍历数组的过程中,以 i 代表当前需要排序的序号,则需要在剩余的 [i…n-1] 中找出其中的最小值,然后将找到的最小值与 i 指向的值进行交换。因为每一趟确定元素的过程中都会有一个选择最大值的子流程,所以人们形象地称之为选择排序。 举个实例来看看: 1.初始: [38, 17, 16, 16, 7, 31, 39, 32, 2, 11] 2.3.i = 0: [2 , 17, 16, 16, 7, 31, 39, 32, 38 , 11] (0th [38]<->8th [2]) 4.5.i = 1: [2, 7 , 16, 16, 17 , 31, 39, 32, 38, 11] (1st [38]<->4th [17]) 6.7.i = 2: [2, 7, 11 , 16, 17, 31, 39, 32, 38, 16 ] (2nd [11]<->9th [16]) 8.9.i = 3: [2, 7, 11, 16, 17, 31, 39, 32, 38, 16] ( 无需交换 ) 10.11.i = 4: [2, 7, 11, 16, 16 ,

归并树

坚强是说给别人听的谎言 提交于 2020-02-26 23:00:38
定义 归并树是线段树和归并排序的合成,它利用线段树将归并排序的每一步都记录下来 例如我们对1,5,3,4,2进行归并排序,就可以生成下面的归并树 归并树的每个父节点就是两个子节点归并排序后的结果 并且归并树的叶子节点的顺序是初始序列的顺序 用处 可以快速求出在原序列的一个区间中比某个数小(大)的有多少个数 于是就可以求区间第k大问题 存储方法 我们发现归并树的每一层数字个数不会超过原数列,所以我们用一个深度*原数列长度的二维数组就可以记录下来 具体操作 建树 由于每个节点是由它的两个子节点归并后构造出来的,所以我们可以递归构造子节点,回溯时构造父节点 void build(int deep,int l,int r){//建树 if(l==r){Merge[deep][l]=a[l];return;}//叶子节点 int mid=(l+r)>>1; build(deep+1,l,mid),build(deep+1,mid+1,r);//先构造子节点 for(int i=l,j=mid+1,k=l;i<=mid||j<=r;){//归并排序构造当前节点 if(j>r)Merge[deep][k++]=Merge[deep+1][i++]; else if(i>mid||Merge[deep+1][i]>Merge[deep+1][j])Merge[deep][k++]=Merge

Java实现的5大排序算法

拈花ヽ惹草 提交于 2020-02-26 15:11:29
Java实现的5大排序算法 排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料。   废话不多说,下面逐一看看经典的排序算法:   1、Java排序算法之选择排序   选择排序的基本思想是遍历数组的过程中,以 i 代表当前需要排序的序号,则需要在剩余的 [i…n-1] 中找出其中的最小值,然后将找到的最小值与 i 指向的值进行交换。因为每一趟确定元素的过程中都会有一个选择最大值的子流程,所以人们形象地称之为选择排序。   举个实例来看看:   1.初始: [38, 17, 16, 16, 7, 31, 39, 32, 2, 11]   2.3.i = 0: [2 , 17, 16, 16, 7, 31, 39, 32, 38 , 11] (0th [38]<->8th [2])   4.5.i = 1: [2, 7 , 16, 16, 17 , 31, 39, 32, 38, 11] (1st [38]<->4th [17])   6.7.i = 2: [2, 7, 11 , 16, 17, 31, 39, 32, 38, 16 ] (2nd [11]<->9th [16])   8.9.i = 3: [2, 7, 11, 16, 17, 31, 39, 32, 38, 16] ( 无需交换 )   10.11.i = 4:

算法之排序(中)-c语言实现

我的未来我决定 提交于 2020-02-26 11:36:42
文章来源: http://blog.seclibs.com/算法之排序中-c语言实现/ 上一篇文章里说了归并排序和快速排序,它们的代码实现是非常相似的,只要理解了其中的具体实现,还是比较容易写出代码的。 归并排序 代码如下,需要下载代码的请移步至文末 快速排序 代码如下,需要下载代码的请移步至文末 代码: 归并排序: GitHub 快速排序: GitHub 文章首发公众号和个人博客 公众号:无心的梦呓(wuxinmengyi) 博客: http://blog.seclibs.com/ 来源: oschina 链接: https://my.oschina.net/u/3677719/blog/3163548

排序之归并排序

半腔热情 提交于 2020-02-26 00:13:22
排序是将一串数据按照其某个或者某些关键字的大小进行递增或递减排列的操作我,通常指的排序是升序,排序方式是原地排序 下面介绍下归并排序 归并排序 原理: 建立在归并操作上的一种有效的排序算法 将已有序的子序列合并,得到完全有序的序列 即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并 归并排序是一个稳定的排序 实现方式 合并:是归并排序的核心操作 代码如下: private void merge(int[] array, int left, int mid, int right) { int i = left; int j = mid; int length = right - left; int[] extra = new int[length]; int k = 0; while(i < mid && j < right) { if(array[i] <= array[j]) { extra[k++] = array[i++]; } else { extra[k++] = array[j++]; } } while (i < mid) { extra[k++] = array[i++]; } while (j < right) { extra[k++] = array[j++]; } // 从 extra 搬移回 array for (int

(分治)归并排序

隐身守侯 提交于 2020-02-25 19:38:01
#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; void mergeSort(int a[], int s, int e, int temp[]) { if (s < e) { int m = s + (e - s) / 2; mergeSort(a, s, m, temp); mergeSort(a, m+1, e, temp); mergeSort(a, m+1, e, temp); merge(a, s, m, e, temp); } } void merge(int a[], int s, int m, int e, int temp[]) { int pb = 0; int p1 = s, p2 = m + 1; while (p1 <= m && p2 <= e) { if (a[p1] < a[p2]) { temp[pb++] = a[p1++]; } else { temp[pb++] = a[p2++]; } } while (p1 <= m) { temp[pb++] = a[p1++]; } while (p2 <= m) { temp[pb++] = a[p2++]; } for (int i = 0; i < e-s+1; i++) { a[i] = temp

挑战七大排序算法-07归并排序

我们两清 提交于 2020-02-21 07:06:56
归并排序 1.原理 排序一个数组,先把数组从中间分成前后两个部分,然后对前后两部分分别排序,再将排序好的两部分合并在一起 2.实现 public void mergeSort(int[] array){ mergeSortInternal(array,0,array.length-1); } ​ private void mergeSortInternal(int[] array,int left,int right){ if (left >= right){ return; } int mid = (left+right)/2; mergeSortInternal(array,left,mid); mergeSortInternal(array,mid+1,right); //合并 merge(array,left,mid,right); } ​ private void merge(int[] array,int l,int m,int r){ int i = l; int j = m+1; int k = 0; int[] extra = new int[r-l+1]; while (i <= m && j <= r){ if(array[i] <= array[j]){ extra[k++] = array[i++]; }else{ extra[k++] = array[j

归并排序指针版及链表版

ε祈祈猫儿з 提交于 2020-02-19 05:40:22
什么是归并排序    归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。   归并排序比较占用内存,但却是一种 效率高且稳定 的算法。其时间复杂度为 O(n log n) ,空间复杂度为 T(n)。其速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。   个人觉得一般归并排序用于链表的排序有奇效! 思路   归并排序的主要思想是 分治 。   主要过程是: 1.将n个元素从中间切开,分成两部分。(左边可能比右边多1个数) 2.将步骤1分成的两部分,再分别进行递归分解。直到所有部分的元素个数都为1。 3.从最底层开始逐步合并两个排好序的数列为一个有序的数列。 图片取自https://www.cnblog.com/chengxiao/p/6194356.html 指针版: # include <stdio.h> # include <string.h> # include <stdlib.h> void sort ( int x , int y , int * st ) ; //将数组分开 void Link ( int x