归并排序
来源:互联网 发布:java获取文件路径 编辑:程序博客网 时间:2024/06/06 13:13
数据结构与算法——排序算法——归并排序
转载自1
转载自2
算法的基本思想:
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。 如:设有数列{6,202,100,301,38,8,1} 初始状态: [6] [202] [100] [301] [38] [8] [1] 比较次数 i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3 i=2 [ 6 100 202 301 ] [ 1 8 38 ] 4 i=3 [ 1 6 8 38 100 202 301 ] 4
具体代码实现:
//// merge.cpp// merge//// Created by scandy_yuan on 13-1-4.// Copyright (c) 2013年 Sam. All rights reserved.//#include <iostream>using namespace std;//将2个有序数组a[first...mid]和a[mid+1...last]数组和合并void mergearray(int a[],int first,int mid,int last, int temp[]){ int i = first,j = mid+1; int m = mid,n = last; int k = 0; //通过循环将2个数组比较后有序的放入到临时数组temp中 while (i<=m && j<=n) { if (a[i] <= a[j]) { temp[k++] = a[i++]; } else { temp[k++] = a[j++]; } } while (i<=m) { temp[k++] = a[i++]; } while (j<=n) { temp[k++] = a[j++]; } //将排好序的临时数组重新放置到原数组a中 for (i=0;i<k;i++) { a[first+i] = temp[i]; }}//使用递归将数组a变成若干有序的小的数组void mergesort(int a[],int first,int last,int temp[]){ if(first < last) { int mid = (first+last)/2; mergesort(a, first, mid, temp); //左边有序 mergesort(a, mid+1, last, temp);//右边有序 mergearray(a, first, mid, last, temp); }}//使用归并排序bool MergSort(int a[],int n){ int *p = new int[n]; if(p==NULL) return false; mergesort(a, 0, n-1, p); delete [] p; return true;}int main(int argc, const char * argv[]){ // insert code here... int a[10] = {2,1,3,7,6,8,9,5,4,0}; MergSort(a, 10); for(int i=0;i<10;i++){ cout << a[i] << endl; } return 0;}
时间复杂度分析如下:
简单的分析下元素长度为n的归并排序所消耗的时间 T[n]: 1. 调用mergeSort()函数划分两部分,那每一小部分排序好所花时间则为 T[n/2], 2. 最后把两部分有序的数组合并成一个有序的数组mergeSort()函数所花的时间为O(n); 3. T[n] = 2T[n/2] + O(n);
具体推导过程如下:
归并排序的时间复杂度为:O(nlogn)
阅读全文
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 出现add_wh.jsf提交时,找不到原来的UIViewRoot.从而认为是新的请求.所以页面就刷新
- Hadoop 学习研究(九): NameNode启动过程
- 进程间通信
- 伪静态如何实现的
- java面试题int a=2*8怎样运算效率最快?
- 归并排序
- Artdialog使用总结
- tf.nn.rnn_cell.MultiRNNCell函数用法
- javaSE_8系列博客——Java语言的特性(三)--类和对象(20)--嵌套类(Lambda 表达式--VS--方法引用)
- jQuery HTML之捕获、设置、元素添加、元素删除
- Python3.X 爬虫实战(缓存与持久化)
- 苹果开发者计划许可协议(2017年5月2日)
- Python3.X 爬虫实战(并发爬取)
- 详解生成器、迭代器