归并排序
来源:互联网 发布:将java类传到jsp里面 编辑:程序博客网 时间:2024/06/05 11:33
归并操作 归并操作(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
总计: 11次
归并操作的工作原理如下:
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
设定两个指针,最初位置分别为两个已经排序序列的起始位置
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针达到序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
A[0]A[1]A[2]A[3]A[4]A[5] 49386597761327
#include <iostream>
#define MAX 1010
using namespace std;
void mergesort(int a[],int first,int mid,int last)
{
int i = first,j = mid + 1,p = 0;
int b[MAX];
while(i <= mid && j <= last)
{
if(a[i] < a[j])
{
b[p++] = a[i++];
}
else
{
b[p++] = a[j++];
}
}
while(i <= mid)b[p++] = a[i++];
while(j <= last)b[p++] = a[j++];
for(i = 0; i < p; i++)
{
a[i + first] = b[i];
}
}
void merge(int a[],int first,int last)
{
if(first >= last)return;
int mid = first + last;
merge(a,first,mid);
merge(a,mid + 1, last);
mergesort(a,first,mid,last);
}
int main()
{
int n,m;
int i,j;
cin>>n;
int a[MAX];
while(n--)
{
cin>>m;
i = 0;
while(m--)
{
cin>>a[i];
i++;
}
merge(a,0,m-1);
for(j = 0; j < m; j++)
{
cout<<a[j]<<" ";
}
cout<<endl;
}
return 0;
}
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- Texture Mapping
- kmp算法
- 基于NIO实现非阻塞Socket编程
- 双链表的插入与删除
- UT-IT-ST-BBIT-SDV-SIT-SVT
- 归并排序
- apache下防止别人域名解析到我们主机上,apache禁止空主机头
- 简单工厂模式(Simple Factory) vs 工厂方法模式(Factory Method)
- [黑马程序员]ashx+html简单模拟aspx的形成
- Struts中从前台向后台action传数组的方法
- 易混淆的概念
- 倍增算法实现后缀数组
- 初次尝试Object-C,编码风格还真不习惯
- shell 中 date的用法