归并排序
来源:互联网 发布:高青县政务网通知公告 编辑:程序博客网 时间:2024/05/16 12:37
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
如 设有数列{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
总计: 11次
基本思路就是将数组分成两组,各自再分成两组。当组内只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的两个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。
#include<iostream>using namespace std;void mergearray(int a[],int left,int mid,int right,int temp[]){int i=left,j=mid+1;int m=mid,n=right;int k=0;while(i<=m&&j<=n){if(a[i]<=a[j])temp[k++]=a[i++];elsetemp[k++]=a[j++];}while (i<=m)temp[k++]=a[i++];while (j<=n)temp[k++]=a[j++];for (i=0;i<k;i++)a[left+i]=temp[i];}void mergesort(int a[], int left, int right, int temp[]){if(left<right){int mid=left+((right-left)>>1);mergesort(a,left,mid,temp); mergesort(a,mid+1,right,temp); mergearray(a,left,mid,right,temp); }}bool MergeSort(int a[], int n){int *p = new int[n];if(!p)return false;mergesort(a,0,n - 1,p);delete[] p;return true;}int main(){//int a[10]={2,6,9,0,1,8,3,7,4,5};int a[10]={2,6,2,0,1,8,3,2,4,5}; MergeSort(a,10);for(int i=0;i<10;i++)cout<<a[i]<<"\t";return 0;}
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- java 下载地址
- android.os.NetworkOnMainThreadException
- CSS选择器
- java 内部类 匿名内部类 嵌套类
- debian下安装mysql5.5
- 归并排序
- Java基础知识(概述)
- 两侧覆盖问题解
- reactor设计模式
- Java基础知识(数组
- android sqlite db-journal文件产生原因及说明 .
- Java(位移的应用)
- Run Loop
- Codeforces Beta Round #69 (Div. 1 Only), problem: (C) Beavermuncher-0xFF 树形DP+优先队列