您的位置:首页 > 理论基础 > 数据结构算法

【数据结构与算法】排序算法之五:归并排序

2015-11-24 21:37 531 查看
一  归并排序

1 基本思想

归并排序和堆排序一样用到了完全二叉树。

古语有云:破而后立。归并排序的思想就是如此。其步骤如下:

(1)  将待排序数组按”二分“的规则”打破“,一直到子数组的长度为1为止

(2)  ”立“的过程就是将子数组两两归并成有序数组,如此重复,直到得到按序排列的数组。

2   实现

首先,我们来看”打破“的代码。void Merge_Sort(SortArray *A , int first , int last)
{
if (first < last) //当first == last 即退出循环
{
int mid = (first + last)/2 +1;
//递归
Merge_Sort(A , first , mid -1); //将数组一分为二 子数组:[first....mid -1]
Merge_Sort(A , mid , last); //子数组[mid....last]
merge(A , first , mid , last);
}
}
”立“的代码则是merge , 下面就是merge的函数代码:
void merge(SortArray *A, int first , int mid , int last)
{
int i , j ,k ;
int B[MAX];//用于做临时数组,保存排序后的数组片段
for (i = first, j = mid , k = first ; i < mid && j <= last ; k++)
{
//选择最小的值
if ((*A)[i] < (*A)[j])
{
B[k] = (*A)[i];
i++;
}
else
{
B[k] = (*A)[j];
j++;
}
}
//将数组中剩余的数补齐
//补齐[i....mid]
while ( i < mid)
{
B[k++] = (*A)[i];
i++;
}
//补齐[j....last]
while ( j <= last)
{
B[k++] = (*A)[j];
j++;
}
//将临时数组值传递给A
for (i = first ; i <= last ; i++)
{
(*A)[i] = B[i];
}
}
本算法中采用临时数组B[max]来存储排序后的算法,虽然增加的算法复杂度,但是有效的减少了内存消耗。也是一种用时间换空间的做法。

下面附上主程序代码:

#include <stdio.h>
#include "stdafx.h"
#include <iostream>
using namespace std;

#define MAX 100
typedef int SortArray[MAX];

int _tmain(int argc, _TCHAR* argv[])
{
int n ;
SortArray A;
cout<<"/**排序**/\n"
<<"请输入数组个数"<<endl;
cin>>n;
cout<<"请输入待排序数组"<<endl;
for (int i = 0 ; i < n ; i++)
{
cin>>A[i];
}
cout<<"正在排序请稍后....."<<endl;
Merge_Sort(&A , 0 , n-1);
cout<<"排序结果如下....."<<endl;
for (int i = 0 ; i < n ; i++)
{
cout<<A[i]<<endl;
}
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息