归并排序
来源:互联网 发布:dx 1vb大屏幕显示器 编辑:程序博客网 时间:2024/06/05 05:49
考察分而治之的思想,将一个大问题分解成子问题,子问题同时可以用同样的办法继续划分。这样的问题往往使用递归,使得代码非常简洁。
先不看代码,思考如果让一个数列有序,我们可以在某一个位置将数列切分两半。然后,假设我们能将切割线左边有序(注意:这里只有与整体要解决的问题一致才能是分治思想,既我整体要解决有序,那么我在考虑分治的时候,子问题也要考虑在有序的基础上),切割线右边也有序,将两个有序数列合并即可(非常基础)。然后左边的子区域依然可以继续划分左右两半部分使用相同的方法,最终递归下去。
#include<iostream>
#include<stdio.h>#define MaxRange 100
using namespace std ;
int arr[MaxRange];
int n;
//归并排序
void unit(int a[],int first,int mid,int end)
{
int tem[MaxRange];
int counter=0,i=first,j=mid;
while(i<mid&&j<end)
{
if(a[i]>a[j])
tem[counter++] = a[j++];
else
tem[counter++] = a[i++];
}
while(i<mid)
tem[counter++] = a[i++];
while(j<end)
tem[counter++] = a[j++];
j=0;
for(int i=first;i<counter+first;i++)
a[i] = tem[j++];
}
void unitSort(int first,int end)
{
//first的意义从first开始,到end结束,但end是个数,从零开始到end-1有数
if(first<end-1)//此处用最小的排序测试first=0,end=1时证明数组个数为1无需做
//first = 0,end = 2时才需要做下面的运算故可以得到相差2在做运算
{
int mid = (first+end)/2;
unitSort(first,mid);//(1)左侧做完归并排序,
unitSort(mid,end);//(2) 右侧做完归并排序
unit(arr,first,mid,end); //将两个有序数组合并
}
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&arr[i]);
unitSort(0,n);//(3) (1)(2)(3)处的参数含义应该保持一致
for(int i=0;i<n;i++)
printf("%d",arr[i]);
}
阅读全文
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- python 3.6X安装notebook后无法打开的解决办法
- 如何学习计算机编程语言
- 【Python】6“dict和set“
- Android-x86-7.1.1
- Shell循环与结构化命令
- 归并排序
- CI框架学习笔记第四天
- UI-1
- 76 从C语言函数调用发现程序运行的秘密
- maven创建web工程
- JS中for循环变量作用域
- Java中的四种引用类型 Strong, Soft, Weak And Phantom
- windows程序函数调用堆栈分布
- Hadoop之——重新格式化HDFS的方案