归并排序
来源:互联网 发布:淘宝创建追评失败 编辑:程序博客网 时间:2024/06/05 10:07
归并排序是一个机遇分治的比较算法。当我们有一个非常大的列表需要排序,将列表分成两个子列表,然后在排序会好些。如果等分后还是很大,我就继续分割,直到可以很简单的排序为止。
归并排序的复杂度不是很高。在最差的时候也是O(nlongn).(快排最差的时候是O(n^2).
其中关键的有两部分。一个是两个有序数组的合并。另一个是分治(把大数组分成小数组,用递归,条件是first<last)
代码如下:
#include <iostream>using namespace std;void mergearray(int a[],int first,int last,int temp[]){int mid=(first+last)/2;int i=first;int j=mid+1;int k=0;while (i<=mid&&j<=last){if(a[i]<a[j])temp[k++]=a[i++];elsetemp[k++]=a[j++];}while (i<=mid)temp[k++]=a[i++];while (j<=last)temp[k++]=a[j++];for (int i=0;i<k;i++)a[i+first]=temp[i]; //这个地方很关键}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, last, temp); //再将二个有序数列合并}}bool MergeSort(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 a[]={4,10,6,8};int temp[4];//mergearray(a,0,3,temp);MergeSort(a,4);for (int i=0;i<4;i++){cout << a[i] <<endl;}return 0;}
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- acm steps 2.1.2(How many prime numbers)
- javascript d3.js
- 古典问题:关于兔子的生命周期。
- 读《互联网创业密码》之感想
- QT4 Creator创建基本的Dialog的几种方式
- 归并排序
- ViewHolder的简洁写法
- 再谈p2p投融资真相
- iOS 类文件重命名操作步骤
- DICOM入门简介
- Objective-C中的日期格式器NSDateFormatter
- 【js报类型未定义的错误】20140826
- golang tcp 2 unix socket proxy
- synchronized用法