归并排序

几种常见的排序的算法 C++

北战南征 提交于 2019-12-10 13:08:20
1.归并排序: 归并排序利用了递归的思想(以及分而治之的思想),将数组一分为二(0~mid),(mind+1~end)左右两个子数组,最后将两部分合并起来。 整体算术法时间复杂度为O(nlogn), 空间复杂度O (n) 。 #include<bits/stdc++.h> using namespace std; //归并过程 void merge(int arr[], int l, int mid, int r){ int help[r-l+1];//辅助数组 int i = 0; int lIndex = l; int rIndex = mid+1; while(lIndex <= mid && rIndex <= r){ help[i++] = arr[lIndex] < arr[rIndex] ? arr[lIndex++]:arr[rIndex++]; } //左边和右边肯定有一边到头了,不可能同时,因为每次只移动一边 while(lIndex <= mid){ help[i++] = arr[lIndex++]; } while(rIndex <= r){ help[i++] = arr[rIndex++]; } //将排好序的辅助数组赋值给原始数组,不需要返回值 for(i = 0; i < r-l+1; i++){ arr[l+i] = help[i]; } } /

归并排序

时光毁灭记忆、已成空白 提交于 2019-12-10 12:03:54
# include <stdio.h> void merge ( int arr [ ] , int L , int M , int R ) { int left_size = M - L ; int right_size = R - M + 1 ; int left_arr [ left_size ] ; int right_arr [ right_size ] ; int i , j , k ; //fill the left array for ( int i = L ; i < M ; i ++ ) { left_arr [ i - L ] = arr [ i ] ; } //fill the right array for ( int i = M ; i <= R ; i ++ ) { right_arr [ i - M ] = arr [ i ] ; } //merge into the original arr i = 0 , j = 0 , k = L ; while ( i < left_size && j < right_size ) { if ( left_arr [ i ] < right_arr [ j ] ) { arr [ k ] = left_arr [ i ] ; i ++ ; k ++ ; } else { arr [ k ] = right

20191209-八大排序之归并排序

谁都会走 提交于 2019-12-10 00:52:39
1. 归并排序 算法核心思想 归并排序使用了二分法,归根到底的思想还是分而治之。拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。具体逻辑实现如下: 将数组按照middle进行递归拆分,最后分到最细之后再将其使用对两个有序数组进行排序的方法对其进行排序 合并2个排序数组的操作为: a) 同时对两个数组的第一个位置进行比大小,将小的放入一个空数组,然后被放入空数组的那个位置的坐标往后移一个 b) 然后继续和另外一个数组的上一个位置进行比较,以此类推 c) 到最后任何一个数组先出栈完,就将另外i一个数组里的所有元素追加到新数组后面 代码实现 def Merge(arr_a,arr_b): """合并arr_a和arr_b2个有序数组""" i = j = 0 res = [] while i<len(arr_a) and j<len(arr_b): if arr_a[i] <= arr_b[j]: res.append(arr_a[i]) i+=1 else: res.append(arr_b[j]) j+=1 if i == len(arr_a): res.extend(arr_b[j:]) else: res

排序算法-归并排序(Java)

浪尽此生 提交于 2019-12-09 13:35:52
package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className MergeSort * @date 2019/12/7 10:24 * @package com.rao.sort * @Description 归并排序 */ public class MergeSort { /** * 归并排序 * @param arr:要排序的数组 * @param left:数组最左边的元素的下标 * @param right:数组最右边的元素的下标 */ public static int[] mergeSort(int[] arr, int left, int right){ //如果left == right,那么说明数组中只有一个元素了 if (left < right){ int mid = (left + right) / 2; arr = mergeSort(arr, left, mid);//对左边的部分进行归并排序 arr = mergeSort(arr, mid+1, right);//对右边的部分进行归并排序 merge(arr, left, mid, right);//将上面两部分进行合并,变成一个有序的数组 } return arr; } /** * 对数组进行合并 *

漫画:什么是归并排序?

时光总嘲笑我的痴心妄想 提交于 2019-12-08 23:10:35
————— 第二天 ————— ———————————— 举个例子,有A、B、C、D、E、F、G、H一共8个武术家参考参加比武大会。 第一轮,两两一组,有4名选手胜出(四分之一决赛) 第二轮,两两一组,有两名选手胜出(半决赛) 第三轮,仅剩的两人一组,冠军胜出(总决赛) 归并排序和擂台赛,有什么相同和不同之处呢?让我们以下面这个数组来举例说明: 归并排序就像是组织一场元素之间的“比武大会”,这场比武大会分成两个阶段: 1.分组 假设集合一共有n个元素,算法将会对集合进行逐层的折半分组。 第一层分成两个大组,每组n/2个元素; 第二层分成4个小组,每组n/4个元素; 第三层分成8个更小的组,每组n/8个元素; ...... 一直到每组只有一个元素为止。 这样一来,整个数组就分成了一个个小小的“擂台”。 2.归并 既然分了组,接下来就要开始“比武”了。 归并排序和擂台赛有一个很大的不同,就是擂台赛只需要决定谁是老大,而并不关心谁做老二和老三;归并排序的要求复杂一些,需要确定每一个元素的排列位置。 因此,当每个小组内部比较出先后顺序以后,小组之间会展开进一步的比较和排序,合并成一个大组;大组之间继续比较和排序,再合并成更大的组......最终,所有元素合并成了一个有序的集合。 这个比较与合并的过程叫做 归并 ,对应英文单词 merge ,这正是归并排序名字的由来。

教你如何迅速秒杀99%的海量数据处理面试题

前提是你 提交于 2019-12-08 18:21:42
教你如何迅速秒杀99%的海量数据处理面试题 教你如何迅速秒杀99%的海量数据处理面试题 作者:July 出处:结构之法算法之道blog 前言 一般而言,标题含有“秒杀”,“99%”,“史上最全/最强”等词汇的往往都脱不了哗众取宠之嫌,但进一步来讲,如果读者读罢此文,却无任何收获,那么,我也甘愿背负这样的罪名,:-),同时,此文可以看做是对这篇文章: 十道海量数据处理面试题与十个方法大总结 的一般抽象性总结。 毕竟受文章和理论之限,本文摒弃绝大部分的细节,只谈方法/模式论,且注重用最通俗最直白的语言阐述相关问题。最后,有一点必须强调的是,全文行文是基于面试题的分析基础之上的,具体实践过程中,还是得具体情况具体分析,且场景也远比本文所述的任何一种场景复杂得多。 OK,若有任何问题,欢迎随时不吝赐教。谢谢。 何谓海量数据处理? 所谓海量数据处理,其实很简单,海量,海量,何谓海量,就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导致无法一次性装入内存。 那解决办法呢?针对时间,我们可以采用巧妙的算法搭配合适的数据结构,如 Bloom filter/Hash/bit-map/堆/数据库或倒排索引/trie/ ,针对空间,无非就一个办法:大而化小: 分而治之/hash映射 ,你不是说规模太大嘛,那简单啊,就把规模大化为规模小的,各个击破不就完了嘛。

大数据——海量数据处理的基本方法总结

可紊 提交于 2019-12-08 18:17:34
声明: 原文引用参考July大神的csdn博客文章 => 海量处理面试题 海量数据处理概述 所谓海量数据处理,就是数据量太大,无法在较短时间内迅速解决,无法一次性装入内存。本文在前人的基础上总结一下解决此类问题的办法。那么有什么解决办法呢? 时间复杂度方面,我们可以采用巧妙的算法搭配合适的数据结构,如Bloom filter/Hash/bit-map/堆/数据库或倒排索引/trie树。空间复杂度方面,分而治之/hash映射。 海量数据处理的基本方法总结起来分为以下几种: 分而治之/hash映射 + hash统计 + 堆/快速/归并排序; 双层桶划分; Bloom filter/Bitmap; Trie树/数据库/倒排索引; 外排序; 分布式处理之Hadoop/Mapreduce。 前提基础知识: 1 byte= 8 bit。 int整形一般为4 bytes 共32位bit。 2^32=4G。 1G=2^30=10.7亿。 1 分而治之+hash映射+快速/归并/堆排序 问题1 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 分析 :50亿*64=320G大小空间。 算法思想1 :hash 分解+ 分而治之 + 归并 遍历文件a,对每个url根据某种hash规则求取hash(url)/1024

数据挖掘、数据分析、海量数据处理的面试题(总结july的博客)

家住魔仙堡 提交于 2019-12-08 18:04:35
缘由 由于有面试通知,现在复习一下十道和海量数据处理相关的题。两篇博客已经讲的非常完备了,但是我怕读懂了并非真的懂,所以必须自己复述一遍。 教你如何迅速秒杀掉:99%的海量数据处理面试题 海量数据处理:十道面试题与十个海量数据处理方法总结 MapReduce技术的初步了解与学习 面试归类 下面6个方面覆盖了大多数关于海量数据处理的面试题: 分而治之/hash映射 + hash统计 + 堆/快速/归并排序; 双层桶划分 Bloom filter/Bitmap; Trie树/数据库/倒排索引; 外排序; 分布式处理之Hadoop/Mapreduce。 下面我讲针对上两篇博客里的海量数据处理的题的解法再复述一遍。 第一类:分治后hash统计再排序 第一题:海量日志数据,提取出某日访问百度次数最多的那个IP 解答: 该题解题思路总共分为三步 分而治之/hash映射:如果该文件过大,不能全部读入内存。我们就必须先利用hash函数将其分割成若干小文件。再分别对各个小文件进行处理。注意这一步我们肯定会将相同的ip放在同一个文件。由于这个题干给的比较少。我只有自己脑补一下,大概给我们的日志中就是百度web服务器自己记录的来自不同的ip的访问。这个日志是按天生成的,所以现在我们要统计一天内,哪一个ip访问本网站百度的次数最多。那么日志中肯定就是记录是访问ip和时间,但是相同的ip肯定是单独的一条

教你如何迅速秒杀99%的海量数据处理面试题

倖福魔咒の 提交于 2019-12-08 18:01:26
前言 一般而言,标题含有“秒杀”,“史上最全/最强”等词汇的往往都脱不了哗众取宠之嫌,但进一步来讲,如果读者读罢此文,却无任何收获,那么,我也甘愿背负这样的罪名,:-),同时,此文可以看做是对这篇文章: 十道海量数据处理面试题与十个方法大总结 的一般抽象性总结。 毕竟受文章和理论之限,本文摒弃绝大部分的细节,只谈方法/模式论,且注重用最通俗最直白的语言阐述相关问题。最后,有一点必须强调的是,全文行文是基于面试题的分析基础之上的,具体实践过程中,还是得具体情况具体分析,且场景也远比本文所述的任何一种场景复杂得多。 OK,若有任何问题,欢迎随时不吝赐教。谢谢。 何谓海量数据处理? 所谓海量数据处理,其实很简单,海量,海量,何谓海量,就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导致无法一次性装入内存。 那解决办法呢?针对时间,我们可以采用巧妙的算法搭配合适的数据结构,如 Bloom filter/Hash/bit-map/堆/数据库或倒排索引/trie/ ,针对空间,无非就一个办法:大而化小: 分而治之/hash映射 ,你不是说规模太大嘛,那简单啊,就把规模大化为规模小的,各个击破不就完了嘛。 至于所谓的单机及集群问题,通俗点来讲,单机就是处理装载数据的机器有限(只要考虑cpu,内存,硬盘的数据交互),而集群,机器有多辆,适合分布式处理,并行计算

大数据——海量数据处理的基本方法总结

时间秒杀一切 提交于 2019-12-08 17:50:28
原文地址为: 大数据——海量数据处理的基本方法总结 声明: 原文引用参考July大神的csdn博客文章 => 海量处理面试题 海量数据处理概述 所谓海量数据处理,就是数据量太大,无法在较短时间内迅速解决,无法一次性装入内存。本文在前人的基础上总结一下解决此类问题的办法。那么有什么解决办法呢? 时间复杂度方面,我们可以采用巧妙的算法搭配合适的数据结构,如Bloom filter/Hash/bit-map/堆/数据库或倒排索引/trie树。空间复杂度方面,分而治之/hash映射。 海量数据处理的基本方法总结起来分为以下几种: 分而治之/hash映射 + hash统计 + 堆/快速/归并排序; 双层桶划分; Bloom filter/Bitmap; Trie树/数据库/倒排索引; 外排序; 分布式处理之Hadoop/Mapreduce。 前提基础知识: 1 byte= 8 bit。 int整形一般为4 bytes 共32位bit。 2^32=4G。 1G=2^30=10.7亿。 1 分而治之+hash映射+快速/归并/堆排序 问题1 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 分析 :50亿*64=320G大小空间。 算法思想1 :hash 分解+ 分而治之 + 归并 遍历文件a