美文网首页
归并排序の分而治之

归并排序の分而治之

作者: 掌灬纹 | 来源:发表于2019-01-31 22:45 被阅读0次

归并排序可以说是分治法的一个很形象的实例

归并排序与快排不同的是,归并排序重点在整合,简单的说把相对分区有序而内部

元素乱序的两区通过归并整合成有序的序列。

归并思路(分治法):

分解:将n个元素一刀从中间分成两个序列

递归:将子序列递归的进行分区划分

解决:合并两个子序列(归并排序的重点)

归并排序的合并(以空间换时间):

申请额外的和原数组大小相同的辅助空间,将原数组元素copy到辅助空间中

定义两个指针:left right ,其中left指向辅助空间头(第一区的头),right指向辅助空间中间元素下一个(第二区的头)比较大小,每次将小的元素覆盖到原数组,并且该指针后移

(Java代码示例)

public class MergeSort {

private static int[] helper;//辅助数组

public static void main(String[] args) {

int[] a = {5,15,8,20,6};

printArray(a);

sort(a);

printArray(a);

}

static void sort(int[] a) {

helper = new int[a.length];

mergeSort(a, 0, a.length - 1);

}

/**

*

* @param arr 待排序数组

* @param p 低位

* @param r 高位

*/

static void mergeSort(int[] arr, int p, int r) {

if(p < r) {

int mid = p + ((r - p)>>1);

mergeSort(arr, p, mid);//左侧排序

mergeSort(arr, mid+1, r);//右侧排序

merge(arr, p, mid, r);

}

}

static void printArray(int[] arr){

for(int i : arr){

System.out.print(i + " ");

}

System.out.println();

}

/**

*

* @param arr 待合并数组

* @param p 低位

* @param mid 中间位置

* @param r 高位

*/

static void merge(int[] arr, int p, int mid, int r) {

//arr中的数据拷贝到helper中

System.arraycopy(arr, p, helper, p, r-p+1);

//辅助数组的两个指针

int left = p;

int right = mid + 1;

//原始数组的指针

int current = p;

while(left <= mid&&right <= r) {

if(helper[left] <= helper[right]) {

arr[current] = helper[left];

current++;

left++;

}else {

arr[current] = helper[right];

current++;

right++;

}

}

while(left <= mid) {//左边没有到头,右边不到头也可以

arr[current] = helper[left];

current++;

left++;

}

}

}

相关文章

  • 归并排序の分而治之

    归并排序可以说是分治法的一个很形象的实例 归并排序与快排不同的是,归并排序重点在整合,简单的说把相对分区有序而内部...

  • 归并排序&快速排序

    归并排序 利用归并的思想实现排序方法,该算法采用经典的分治策略,分而治之。 代码实现 基础设置 归并排序 —— 非...

  • 快速排序、表排序、基数排序

    -快速排序 算法概述:与归并相似,分而治之void Quicksort ( ElementType A[ ] , ...

  • 排序算法(五)归并排序

    排序算法(五 )归并排序 1.算法思路  归并排序(Merge-Sort)是一种基于二叉堆及分而治之思想的排序算法...

  • 算法复习-归并类排序(1)-二路归并排序

    二路归并排序 归并排序可以看作一个分而治之的过程:先将整个序列分成两半,对每一半分别进行归并排序,将得到两个有序序...

  • 归并排序

    看了下归并排序,总体来说思想很简单,实现起来也不是很难。 原理 用图说明就好啦,归并排序是基于分而治之的思想,主要...

  • 算法-排序-归并排序

    什么是归并排序 归并排序的核心思维就是分治,分而治之。将大问题分解成小问题,解决完小问题,大问题也就解决了。眼熟吗...

  • 排序算法总结(二)

    归并排序 归并排序用的是分而治之的方法。也就是把列表从中间分成两个子列表,子列表又各自分为两个子列表……这样直到最...

  • 归并排序

    归并排序的基本思想是:利用递归和分而治之(Divide and Conquer)的方法将待排序的数组划分成越来越小...

  • 面试题-海量数据处理问题

    类型一 海量数据,出现次数最多or前K 分而治之/Hash映射 + Hash统计 + 堆/快速/归并排序 1、海量...

网友评论

      本文标题:归并排序の分而治之

      本文链接:https://www.haomeiwen.com/subject/oxolsqtx.html