归并排序(分治)


 1 #include <stdio.h>
2 #include <stdlib.h>
3
4 void MerageSort(int *A, int low, int high);
5 void Merge(int *A, int low, int middle, int high);
6
7 int main()
8 {
9
10 int array[] = {2, 3, 6, 5, 4, 3, 3};
11 int low = 0, high = 7;
12
13 int i = 0;
14 for(i = low; i < high; i++)
15 {
16 printf("%d ", array[i]);
17 }
18 printf("\n");
19
20 MerageSort(array, low, high - 1);
21
22
23 system("pause");
24 return 0;
25 }
26
27 void Merge(int *A, int low, int middle, int high)
28 {
29 int i = low, j = middle + 1;
30 int m = middle, n = high;
31 int k = 0;
32 int *A1 = (int*)malloc((high - low + 1)*sizeof(int));
33 printf("low = %d, middle = %d, high = %d\n", low, middle, high);
34
35 while(i <= m && j <= n)
36 {
37 if(A[i] < A[j])
38 {
39 A1[k] = A[i];
40 i++;
41 }
42 else
43 {
44 A1[k] = A[j];
45 j++;
46 }
47 k++;
48 }
49
50 while(i <= m) //加到尾部
51 {
52 A1[k] = A[i];
53 k++;
54 i++;
55 }
56
57 while(j <= n) //加到尾部
58 {
59 A1[k] = A[j];
60 k++;
61 j++;
62 }
63
64 for(i = 0; i < high -low + 1; i++)
65 {
66 A[low + i] = A1[i];
67 printf("%d ", A[low + i]);
68 }
69 printf("\n");
70
71 free(A1);
72 A1 = NULL;
73 }
74
75
76 void MerageSort(int *A, int low, int high)
77 {
78 int middle = 0;
79 if(low < high)
80 {
81 middle = (low + high)/2;
82 MerageSort(A, low, middle);
83 MerageSort(A, middle+1, high);
84 Merge(A, low, middle, high);
85
86 }
87 }

运行结果:

时间: 2024-10-14 13:00:45

归并排序(分治)的相关文章

归并排序 分治+递归

0      1    2     3     4     5     6     7     8   //下标 {  9  ,  4  ,  3  ,  7  ,  3  ,  8  ,  2  ,  4  ,  8  }//通过mergesort函数递归 来切 开始的时候fir=0, las=8, mid=4  所以下标0-4,分为前组   5-8分为后组 {  9  , 4   ,  3  ,  7  ,  3 }{ 8   , 2   , 4  ,  8  } {  9   , 4  ,

POJ 2299 Ultra-QuickSort (树状数组or 归并排序分治求逆序对数)

题目大意就是说帮你给一些(n个)乱序的数,让你求冒泡排序需要交换数的次数(n<=500000) 显然不能直接模拟冒泡排序,其实交换的次数就是序列的逆序对数. 由于数据范围是 0 ≤ a[i] ≤ 999,999,999所以先要离散化,然后用合适的数据结果求出逆序 可以用线段树一步一步添加a[i],每添加前查询前面添加比它的大的有多少个就可以了. 也可用树状数组,由于树状数组求的是(1...x)的数量和所以每次添加前查询i-sum(a[i])即可 树状数组: //5620K 688MS #incl

分治算法——归并排序与快速排序

1.归并排序 分治思想:每次从中间分开为两个子问题,对每个子问题排序完成之后,将两个已排序的部分进行归并操作即得到最终排序的结果. (1)如果数组S中元素个数为0或者1返回 (2)选取中间位置的元素下标,对左半部分SL递归排序,对右半部分SR递归排序 (3)将排好序的SL.SR进行归并后返回最终结果 平均时间复杂度O(NlogN),最坏情况也为O(NlogN),最好情况为O(N). C++模版实现: template <typename T> void TMergeSort(vector<

归并排序、最大子数组

1.归并排序 分治模式: (1)分解原问题为若干子问题,这些子问题是原问题的规模较小的实例. (2)解决子问题,递归求解子问题.子问题规模足够小时,直接求解. (3)合并子问题的解,得到原问题的解. 归并排序完全遵循分治模式. (1)分解待排序的n个元素列成各具n/2个元素的两个子序列. (2)使用归并排序递归地排序两个子序列. (3)合并两个已排序的子序列,产生已排序的答案. 时间复杂度:T(n)=O(n*lgn) 代码: #include<iostream> #include<vec

归并和归并排序

归并操作:是将两个有序独立的文件合并成为一个有序文件的过程. 归并排序:和快速排序的过程相反,它是两个递归调用(排序子文件)后是一个归并的过程. 快速排序时,先分解成两个子问题后是两个递归调用(排序子文件)的过程. 归并操作 1 基本的两路归并 2 抽象原位归并 归并排序 1 自顶向下的归并排序 2 自底向上的归并排序 3 归并排序的性能特征 归并排序的链表实现 归并排序与快速排序对比 1. 归并操作 1.1 基本的两路归并 将两个已经有序的数组 a 和 b 合并成一个有序的数组 c . 归并操

复习---归并排序求逆序对--计蒜客2017noip模拟赛二--蒜头君的排序

题目链接:https://nanti.jisuanke.com/t/16443 我不会矩阵快速幂,所以只拿了60分, 发现归并排序掌握的并不熟练,借此良机复习一下. 重在归并排序分治思想,要牢记! #include<iostream> #include<cstring> using namespace std; int n,m,a[30005],s[30005],ans,d[30005]; void msort(int l,int r) { if(l==r)return;//如果只

POJ 1804 逆序对数量 / 归并排序

Brainman Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12175   Accepted: 6147 Description Background Raymond Babbitt drives his brother Charlie mad. Recently Raymond counted 246 toothpicks spilled all over the floor in an instant just

探讨排序算法的实现

排序算法是我们工作中使用最普遍的算法,常见的语言库中基本都会有排序算法的实现,比如c标准库的qsort,stl的sort函数等.本文首先介绍直接插入排序,归并排序,堆排序,快速排序和基数排序等比较排序算法,然后介绍计数排序,基数排序等具有线性时间的排序算法.本文主要讨论算法的实现方法,并不会过多介绍基本理论. 评价一个排序算法优劣适用与否,一般需要从三个方面来分析 时间复杂度.用比较操作和移动操作数的最高次项表示,由于在实际应用中最在乎的是运行时间的上限,所以一般取输入最坏情况的下的运行时间作为

算法手记(4)算法分析

“我的程序会运行多长时间?为什么我的程序耗尽了所有内存?” 在我们使用计算机解决困难问题或是处理大量数据时,不可避免地会产生这些疑问.为这些基础问题给出答案有时其实非常简单,这个过程是科学方法,这就是我们今天讨论的内容. 科学方法概述: 科学家用于观察世界的方法对于研究计算机程序一样有效: 1.观察真实世界特点 2.提出假设模型 3.根据假设模型预测未来事件 4.继续观察并核实预测的准确性 5.如此反复直至确认预测与观察一致 正如爱因斯坦所说:“再多的实验也不一定能够证明我是对的,但只需要一个实

[学习笔记]数据结构与算法

1.排序简单排序:?冒泡排序:将n个数从上往下排列,从第0个数开始依次对前n个.前n-1个.前n-2个数进行比较,保持小数在前大数在后,不符合就交换.在这个过程中,最后一个数始终是最大数.?选择排序:对所有n个.后n-1个.后n-2个依次比较,用一个变量存最小数,一趟比较完成之后,将最小数与所比较数据的第一个数进行交换.在这个过程中,第一个数始终是最小数.?插入排序:从第1个数开始向前扫描比较,小则插入.对于未排序数据,在已排序序列中向前扫描,并找到相应的位置插入.在这个过程中,整个序列局部有序