一 归并排序
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;
}