归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。
归并排序是稳定排序,它也是一种十分高效的排序,能利用完全二叉树特性的排序一般性能都不会太差。从上文的图中可看出,每次合并操作的平均时间复杂度为O(n),而完全二叉树的深度为|log2n|。总的平均时间复杂度为O(nlogn)。而且,归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。
C++实现代码:
#include <iostream>
using namespace std;
void merge(int *data,int start,int end,int *result)
{
//合并
int left_length=(end-start+1)/2+1;
int left_index=start;
int right_index=start+left_length;
int result_index=start;
while (left_index<start+left_length&&right_index<end+1) {
//左、右指针都没有越界
if (data[left_index]<=data[right_index]) {
result[result_index++]=data[left_index++];
}
else
result[result_index++]=data[right_index++];
}
while (left_index<start+left_length) {
//左指针没有越界,右指针已经到末尾
result[result_index++]=data[left_index++];
}
while (right_index<end+1) {
//右指针没有越界,左指针已经到中间
result[result_index++]=data[right_index++];
}
}
void merge_sort(int *data,int start,int end,int *result)
{
if (1==end-start) {
//只有两个数
if (data[start]>data[end]) {
int temp=data[start];
data[start]=data[end];
data[end]=temp;
}
}
else if (end==start)
//只有一个数
return;
else
{
merge_sort(data, start, (end-start+1)/2+start, result);//分
merge_sort(data, (end-start+1)/2+1+start, end, result);//分
merge(data,start,end,result);//合并
for (int i=start; i<=end; i++) {
data[i]=result[i];
}
}
}
int main(){
int data[]={6,202,100,301,38,8,1};
int length=sizeof(data)/sizeof(int);
int result[length];
cout<<"before sorted:"<<endl;
for (int i=0; i<length; i++) {
cout<<data[i]<<" ";
}
cout<<endl;
cout<<"after sorted:"<<endl;
merge_sort(data, 0, length-1, result);
for (int i=0; i<length; i++) {
cout<<data[i]<<" ";
}
return 0;
}