归并排序

归并排序

社会主义新天地 提交于 2020-02-09 01:29:56
归并排序 定义 归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组。将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可 算法描述 把长度为n的输入序列分成两个长度为n/2的子序列; 对这两个子序列分别采用归并排序; 将两个排序好的子序列合并成一个最终的排序序列。 代码实现 def merge_sort ( alist ) : if len ( alist ) <= 1 : return alist # 二分分解 num = len ( alist ) / 2 left = merge_sort ( alist [ : num ] ) right = merge_sort ( alist [ num : ] ) # 合并 return merge ( left , right ) def merge ( left , right ) : '''合并操作,将两个有序数组left[]和right[]合并成一个大的有序数组''' #left与right的下标指针 l , r = 0 , 0 result = [ ] while l < len ( left ) and r < len ( right ) : if

归并排序

醉酒当歌 提交于 2020-02-08 23:20:19
基本思想 归并操作的工作原理如下: 第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置 第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 重复步骤3直到某一指针超出序列尾 将另一序列剩下的所有元素直接复制到合并序列尾 C++代码 # include <iostream> using namespace std ; void merge ( int arr [ ] , int l , int r , int m ) { int help [ r - l + 1 ] ; int i = 0 ; int p1 = l ; int p2 = m + 1 ; while ( p1 <= m && p2 <= r ) { help [ i ++ ] = arr [ p1 ] < arr [ p2 ] ? arr [ p1 ++ ] : arr [ p2 ++ ] ; } while ( p1 <= m ) { help [ i ++ ] = arr [ p1 ++ ] ; } while ( p2 <= r ) { help [ i ++ ] = arr [ p2 ++ ] ; } for ( i = 0 ; i < r - l + 1 ; i ++ ) { arr

归并排序

安稳与你 提交于 2020-02-08 18:55:01
自己练习,参考的博主在下方 思想: 1,就是将一个混乱的数组分割,直至数组的长度<2, 2,再将他们合并排序为一个短的数组。 3,重复2步骤 4,得到一个有序的数组 时间复杂度:O(nlogn) import java.util.Arrays; public class GuiBing { public static void main(String[] args) { int []arr={19,97,1,8,9,17,3,18,19,1,2,4,6,79,484,54,61,22,33,44,55,66,77,99,444,55,16,23}; int[] sort = sort(arr); System.out.println(Arrays.toString(sort)); } public static int[] sort(int []arr) { arr= Arrays.copyOf(arr,arr.length); //如果递归的数组只有一个元素,那么直接返回,不用经过下面的 if(arr.length<2) { return arr; } //将每次递归的数组切半,直至他不能再被分割 int moddile= (int) Math.floor(arr.length/2); int[] left=Arrays.copyOfRange(arr,0,moddile);

归并排序

荒凉一梦 提交于 2020-02-08 17:21:06
归并排序是什么 归并排序之递归版 package Sort.MergeSort; import Sort.SortTestHelper; import java.util.Arrays; /** * 在这里编写类的功能描述 * * @author wangkai * @created 2020/2/8 */ public class MergeSort { private MergeSort() { } public static void sort(Comparable[] arr) { sort(arr, 0, arr.length - 1); } public static void sort(Comparable[] arr, int l, int r) { if (l >= r) return; int mid = (r + l) / 2; sort(arr, l, mid); sort(arr, mid + 1, r); merge(arr, l, mid, r); } public static void merge(Comparable[] arr, int l, int mid, int r) { Comparable[] aux = Arrays.copyOfRange(arr, l, r + 1); //初始化,i指向左半部分起始位置,j指向右半部分起始位置

归并排序(merge sort)

六月ゝ 毕业季﹏ 提交于 2020-02-07 23:09:38
1.归 ListNode* sortList(ListNode* head) { if (head == nullptr || head->next == nullptr) return head; // 1.将待排序序列分为两部分 ListNode* pre = nullptr, *slow = head, *fast = head; while(fast != nullptr && fast->next != nullptr) { pre = slow; slow = slow->next; fast = fast->next->next; } pre->next = nullptr; // 2.对两个子部分再次进行划分 ListNode* l1 = sortList(head); ListNode* l2 = sortList(slow); // 3.合并 return merge(l1, l2); } 2.并 ListNode* merge(ListNode* l1, ListNode* l2) { ListNode* p = nullptr; if(l1->val < l2->val) { p = l1; l1 = l1->next; } else { p = l2; l2 = l2->next; } ListNode* l = p; while(l1 !=

归并排序

北城以北 提交于 2020-02-07 10:39:47
归并排序的概要 1.核心思想 归并排序属于排序方式的一种,相比于冒泡排序其速度要快很多,稍次于快速排序。该方法的重要思想为分治法,首先将整个数据从中间一分为二,然后左右俩边再重复上述操作,直至分为每个子段只有一个数,这时候我们可以认为这个子段是有序的了,然后俩俩相比较合并达到排序效果,其排序类型为稳定排序。 2.代码 # include <stdio.h> # include <stdlib.h> void Merge ( int Arr1 [ ] , int Arr2 [ ] , int start , int mid , int end ) //start是数组头元素,mid是中间值,因为要从中间一分为二,end就是结尾啦 { int i = start , j = mid + 1 , k = start ; while ( i != mid + 1 && j != end + 1 ) { if ( Arr1 [ i ] > Arr1 [ j ] ) Arr2 [ k ++ ] = Arr1 [ j ++ ] ; else Arr2 [ k ++ ] = Arr1 [ i ++ ] ; } //如果最后俩个数组合并后有一个没用完,那没用完的数一定有序,依次加在后面即可 while ( i != mid + 1 ) Arr2 [ k ++ ] = Arr1 [ i ++ ] ;

数据结构——归并排序

孤街浪徒 提交于 2020-02-07 05:29:32
归并排序 一:归并排序基本介绍 归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法是指将问题先进行划分,划分成一些小问题,然后在家进行递归求解,而治的阶段则是将分的阶段得到的各答案“修补”在一起,即分而治之)。 二:规避给排序思想示意图 归并排序先将待排序的数组进行划分,如图数组[8,4,5,7,1,3,6,2],当进行完划分之后会变成8,4,5,7,1,3,6,2单个数据。然后在进行 治 操作,整个过程会执行array.length-1次合并操作。 在治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中最后一次合并,将[4,5,7,8],[1,2,3,6]两个数组进行合并,合并成最终的 [1,2,3,4,5,6,7,8],实现步骤如下: 三:代码 package 排序算法 ; /* 归并排序 */ import java . text . SimpleDateFormat ; import java . util . Date ; public class MergetSort { public static void main ( String [ ] args ) { // int[] array = {8,4,5,7,1,3,6,2}; int [ ] array = new int [ 80000 ] ; for ( int i =

算法浅谈——分治算法与归并、快速排序(附代码和动图演示)

我怕爱的太早我们不能终老 提交于 2020-02-06 09:50:39
在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法。 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及建模。今天这篇文章呢,就正式和大家聊一聊将大问题简化成小问题的分治算法的经典使用场景——排序。 排序算法 排序算法有很多,很多博文都有总结,号称有十大经典的排序算法。我们信手拈来就可以说上来很多,比如插入排序、选择排序、桶排序、希尔排序、快速排序、归并排序等等。老实讲这么多排序算法,但我们实际工作中并不会用到那么多,凡是高级语言都有自带的排序工具,我们直接调用就好。为了应付面试以及提升自己算法能力呢,用到的也就那么几种。今天我们来介绍一下利用分治思想实现的两种经典排序算法——归并排序与快速排序。 归并排序 我们先来讲归并排序,归并排序的思路其实很简单,说白了只有一句话:两个有序数组归并的复杂度是 \(O(n)\) 。 我们举个例子: a = [1, 4, 6] b = [2, 4, 5] c = [] 我们用i和j分别表示a和b两个数组的下标,c表示归并之后的数组,显然一开始的时候i, j = 0, 0。我们不停地比较a和b数组i和j位置大小关系,将小的那个数填入c。 填入一个数之后: i = 1 j = 0 a = [1, 4, 6] b = [2, 4, 5] c = [1] 填入两个数之后: i = 1 j = 1 a

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

。_饼干妹妹 提交于 2020-02-06 01:20:36
文章来源:http://blog.seclibs.com/算法之排序中-c语言实现/ 上一篇文章里说了归并排序和快速排序,它们的代码实现是非常相似的,只要理解了其中的具体实现,还是比较容易写出代码的。 归并排序 代码如下,需要下载代码的请移步至文末 快速排序 代码如下,需要下载代码的请移步至文末 代码: 归并排序: GitHub 快速排序: GitHub 文章首发公众号和个人博客 公众号:无心的梦呓(wuxinmengyi) 博客:http://blog.seclibs.com/ 来源: CSDN 作者: Vesel『无心』 链接: https://blog.csdn.net/qq_18501087/article/details/104188074

插入与归并(PAT)

感情迁移 提交于 2020-02-05 01:24:30
1.题目描述: 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。 归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列。 现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法? 2.输入描述: 输入在第一行给出正整数N (<=100);随后一行给出原始序列的N个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。 3.输出描述: 首先在第1行中输出“Insertion Sort”表示插入排序、或“Merge Sort”表示归并排序;然后在第2行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行末不得有多余空格。 4.输入例子: 10 3 1 2 8 7 5 9 4 6 0 1 2 3 7 8 5 9 4 6 0 5.输出例子: Insertion Sort 1 2 3 5 7 8 9 4 6 0 6.解题思路: 1. 做这道题我们首先要会《插入排序》和《归并排序》俩种排序算法 (不知道这两种排序的可以单独学习,注意该题要用的是迭代法而不是递归方法) ;