归并排序

【Python实现归并排序】 -- 2019-08-14 17:28:39

南笙酒味 提交于 2019-11-27 08:10:22
原文: http://www.gqylpy.com/106/gqy/347 "首先,归并排序使用了二分法,归根到底的思想还是分而治之。拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去。然后再将它们按照两个有序数组的样子合并起来。这样说起来可能很难理解,所以 图就来了: 归并排序将数组以中间的值进行拆分,最后分到最细之后再将其使用对两个有序数组进行排序的方法对其进行排序。 两个有序数组排序的方法则非常简单,同时对两个数组的第一个位置进行比大小,将小的放入一个空数组,然后将放入空数组的那个位置的指针往后移一个,然后继续和另外一个数组的上一个位置进行比较,以此类推。到最后任何一个数组先出栈完,就将另外一个数组里的所有元素追加到新数组后面。 递归拆分的时间复杂度是logN,进行两个有序数组排序的方法复杂度是N,所以该算法的时间复杂度是N*logN,即NlogN。 Python代码示例: lst = [2, 5, 7, 8, 9, 1, 3, 4, 6] def merge_sort(lst, low, high): # 不断递归调用自己,直至拆分成单个元素的时候返回这个元素,不再拆分 if low < high: # 取拆分的中间位置 mid = (low + high) // 2 merge_sort(lst, low, mid) # 左 merge_sort(lst,

归并排序python实现源码

一曲冷凌霜 提交于 2019-11-27 07:59:16
将开发过程经常用到的一些代码片段收藏起来,下面的资料是关于归并排序python实现的代码,应该能对码农们有一些用。 def mergesort(arr): if len(arr) == 1: return arr m = len(arr) / 2 l = mergesort(arr[:m]) r = mergesort(arr[m:]) if not len(l) or not len(r): return l or r result = [] i = j = 0 while (len(result) < len(r)+len(l)): if l[i] < r[j]: result.append(l[i]) i += 1 else: result.append(r[j]) j += 1 if i == len(l) or j == len(r): result.extend(l[i:] or r[j:]) break return result 来源: https://www.cnblogs.com/tudou990/p/11352622.html

排序之外部排序

℡╲_俬逩灬. 提交于 2019-11-27 07:12:08
排序之外部排序 有时,待排序的文件很大,计算机内存不能容纳整个文件,这时候对文件就不能使用内部排序了(这里做一下说明,其实所有的排序都是在内存中做的,这里说的内部排序是指待排序的内容在内存中就可以完成,而外部排序是指待排序的内容不能在内存中一下子完成,它需要做内外存的内容交换),外部排序常采用的排序方法也是归并排序,这种归并方法由两个不同的阶段组成: 1、采用适当的内部排序方法对输入文件的每个片段进行排序,将排好序的片段(成为归并段)写到外部存储器中(通常由一个可用的磁盘作为临时缓冲区),这样临时缓冲区中的每个归并段的内容是有序的。 2、利用归并算法,归并第一阶段生成的归并段,直到只剩下一个归并段为止。 例如要对外存中4500个记录进行归并,而内存大小只能容纳750个记录,在第一阶段,我们可以每次读取750个记录进行排序,这样可以分六次读取,进行排序,可以得到六个有序的 归并段 ,如下图: 每个归并段的大小是750个记录,记住,这些归并段已经全部写到临时缓冲区(由一个可用的磁盘充当)内了,这是第一步的排序结果。 完成第二步该怎么做呢?这时候归并算法就有用处了,算法描述如下: 1、将内存空间划分为三份,每份大小250个记录,其中两个用作输入缓冲区,另外一个用作输出缓冲区。首先对Segment_1和Segment_2进行归并,先从每个归并段中读取250个记录到输入缓冲区,对其归并

归并排序

懵懂的女人 提交于 2019-11-27 06:06:51
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并 public static int [ ] mergeSort ( int [ ] array ) { // 后两个参数表示要进行归并排序的区间. // [0, array.length) // new 足够大的数组, 把这个数组作为缓冲区传给 // 递归函数 mergeSortHelper ( array , 0 , array . length ) ; return array ; } private static void mergeSortHelper ( int [ ] array , int left , int right ) { // [left, right) 构成了要去进行归并排序的区间 // 如果区间为空区间, 或者只有一个元素, 都不用排序 if ( left >= right || right - left == 1 ) { // 空区间或者区间只有一个元素, 都不需要进行归并排序 return ; } // 使用类似后序遍历的方式. // 先把当前的待排序区间拆成两半, //

归并排序

淺唱寂寞╮ 提交于 2019-11-27 03:38:16
def merge(a, b): c = [] h = j = 0 while j < len(a) and h < len(b): if a[j] < b[h]: c.append(a[j]) j += 1 else: c.append(b[h]) h += 1 if j == len(a): last = [i for i in b[h:] ] else: last = [i for i in a[j:] ] return c+last def merge_sort(lists): if len(lists) <= 1: return lists middle = len(lists)//2 left = merge_sort(lists[:middle]) right = merge_sort(lists[middle:]) return merge(left, right) #测试用例 if __name__ == '__main__': a = [10, 1, 15, 32, 21] print (merge_sort(a)) 来源: https://blog.csdn.net/weixin_42062230/article/details/99331308

常用排序算法

血红的双手。 提交于 2019-11-27 02:54:45
笔者最近学习算法,学了很久也只弄懂了几个排序算法,在这里晒一下下,作为以后参考之用。 一、 为什么要研究排序问题 许多计算机科学家认为,排序算法是算法学习中最基本的问题,原因有以下几点: l 有时候应用程序本身需要对信息进行排序,如为了准备客户账目,银行需要对支票账号进行排序 l 很多算法将排序作为关键子程序 l 现在已经有很多排序算法,它们采用各种技术 l 排序时一个可以证明其非平凡下界的问题,并可以利用排序问题的下界证明其他问题的下界 l 在实现排序算法是很多工程问题即浮出水面 二、 排序问题的形式化定义 输入:由 n 个数组成的一个序列 <a 1 ,a 2 , …… ,a n > 输出:对输入序列的一个排列(重排) <a 1 ’,a 2 ’, …… ,a n ’>, 使得 a 1 ’ ≤ a 2 ’ ≤……≤ a n ’ 【说明】在实际中,待排序的数很少是孤立的值,它们通常是成为激励的数据集的一个部分,每个记录有一个关键字 key, 是待排序的值,其他数据位卫星数据,它们通常以 key 为中心传递。 三、 相关概念 1. 排序的稳定性: 在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的;若具有相同关键字的记录之间的相对次序发生变化,则称这种排序方法是不稳定的。 A. 稳定排序: 插入排序 、冒泡排序

填坑之归并排序

非 Y 不嫁゛ 提交于 2019-11-27 00:03:46
填坑之归并排序 归并排序: 复杂度:稳定的O(nlogn) 空间:两倍空间 应用:求逆序对 算法思想:将数据划分为若干个有序的小区间,每次将两个区间合并时也许满足有序 逆序对 洛谷P1908 利用归并排序的思想,每次出现右端区间的数小于左区间时,统计出现的逆序对数目 #include <iostream> #include <cstdio> using namespace std; #define ll long long #define R register int n;long long ans=0; int a[500005+5],rr[500005+5]; void msort(int l,int r) { int mid=l+r>>1; if(l==r)return; msort(l,mid);msort(mid+1,r); int x=l,y=mid+1,tot=l; while(x<=mid&&y<=r) if(a[x]<=a[y])rr[tot++]=a[x++]; else rr[tot++]=a[y++],ans+=(ll)mid-x+1; while(x<=mid)rr[tot++]=a[x++]; while(y<=r)rr[tot++]=a[y++]; for(R int i=l;i<=r;i++)a[i]=rr[i]; } int main() {

C++归并排序算法的代码

旧城冷巷雨未停 提交于 2019-11-26 21:09:13
把开发过程中比较重要的内容片段备份一次,如下的资料是关于C++归并排序算法的内容,希望对各朋友有一些用。 #include<cstdlib> #include<limits> #include<iostream> #include<vector> #include<iomanip> using namespace std; typedef vector<int>::iterator ivecIte; void merge(vector<int> &ivec, ivecIte iteB, ivecIte iteMark, ivecIte iteE) { vector<int> v1(iteB, iteMark), v2(iteMark, iteE); v1.push_back(numeric_limits<int>::max()); v2.push_back(numeric_limits<int>::max()); ivecIte ite1 = v1.begin(), ite2 = v2.begin(); for(ivecIte iteTurn = iteB; iteE != iteTurn; ++iteTurn){ } } void mergeSort(vector<int> &ivec, ivecIte iteB, ivecIte iteE) { size_t div =

排序算法之归并排序

左心房为你撑大大i 提交于 2019-11-26 17:54:43
归并排序 基本思想 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。利用将已有序的子序列合并,得到完全有序的序列进行排序;即先使每个子序列有序,再使子序列段间有序。然后继续进行归并直到最后整个序列有序。 排序过程 算法首先将待排序序列均分为两部分,然后对于每部分继续均分下去,直到划分为不可分割的一个元素为止;然后按照分割的逆向进行归并,归并两个分组时,依次比较两个分组内的元素的大小,以此来进行排序操作,当一次归并排序完成后,继续和其他的分组以相同的方式进行归并,直到归并为一整个待排序序列,此时整个序列便已经有序,算法结束。 C语言代码实现 递归方式实现: // 升序排序 void _MergeSort ( int * a , int left , int right , int * tmp ) { if ( left == right ) return ; int mid = left + ( right - left ) / 2 ; // [left, mid] [mid + 1, right] 分别有序 _MergeSort ( a , left , mid , tmp ) ; _MergeSort ( a , mid + 1 , right , tmp ) ; //

7--归并排序

我的梦境 提交于 2019-11-26 16:56:50
思想: 将待排序序列分为两个子序列,再将两个子序列递归的继续分下去,直到序列有序,即序列中只有一个元素,再把所有有序子序列逐层合并为一个整体有序序列。(每次合并是将两个有序表合并成一个有序表)。 图示: 具体实现: 把待排序序列分为两个子序列,然后让子序列继续分子序列。 把由同一个序列分出来的两个子序列合并。 申请内存空间,空间大小是两个已排序序列的和,用来暂时存放合并后的序列; 设置两个指针变量,分别指向两个已排序列数组的起始位置; 重复上一步骤直到某一指针到达序列尾; 当一个指针到达序列尾的时候,将另一个序列中的元素直接复制到合并序列的尾部; 将合并序列中的元素复制到原数组合适的位置。 代码实现: package www . sort ; import java . util . Arrays ; public class MergeSort { public static void main ( String [ ] args ) { int [ ] array = { 9 , 2 , 5 , 7 , 3 , 8 , 3 , 6 , 1 } ; mergeSort ( array , 0 , array . length - 1 ) ; System . out . println ( Arrays . toString ( array ) ) ; } public