您的位置:首页 > 其它

归并排序

2013-11-23 20:50 162 查看
真的没有想到,以前不曾关注的归并排序原来是这么的复杂。其实,快速排序、堆排序以及归并排序都用到了递归思想,难点就是找出递归形式和递归出口。然而,归并排序还是实际中能够应用到的一种算法--分布式处理。因为,现实中,数据量会比较大,超出一台计算机的内存上限是可能的,这就需要将数据分配到若干台计算机上并行计算。这和现在正在学习的hadoop又不谋而合,因此,现在来学一下归并排序。

对于归并排序,因为所选的数据结构不同,它的实现也不大相同,但原理上还是一样的。都是先将数据一分再分,直到有序为止(也就是每个分项中只有一个元素的时候),然后两两开始合并,直至合并为一个有序项为止。

下面先看看它的数组结构下的实现吧

//合并数组
void MergeArray(int[] a, int first, int second, int length, int[] temp){
int i = first,j = second,t = 0;
while(i < second && j < length){
if(a[i] < a[j])
temp[t++] = a[i++];
else
temp[t++] = a[j++];
}
while(i < second)
temp[t++] = a[i++];
while(j < length)
temp[t++] = a[j++];
i = first;
while(i < length)
a[i++] = temp[i-first];
}


//元素排序
void mergeSort(int[] a,int low, int length,int[] temp){
if(low < length){
int mid = (low + length) / 2;
mergeSort(a, low, mid);
mergeSort(a,mid, length);
MergeArray(a,low,mid,length,temp);
}
}


void MergeSort(int[] a, int length){
int[] temp = new int[length];
int low = 0;
mergeSort(a,low,length);
delete[] temp;
}


下面是链表结构的排序:

//结构体定义
struct node{
int data;
node* next;
};
//合并链表
node* MergeLink(node* link1,node link2){
if(!link1)
return link2;
if(!link2)
return link1;
node* temp;
if(link1->data < link2->data){
temp = link1;
link1 = link1->next;
}
else {
temp = link2;
link2 = link2->next;
}
temp->next = MergeLink(link1,link2);
return temp;
}


node* MergeSort(node* link){
if(!link)
return NULL;
if(!link->next)
return link;
node* link1 = link;
node* link2 = link;
node* Link = link;
//将链表分成两份
while(link2->next&&link2->next->next){
link1 = link1->next;
link2 = link2->next->next;
}
link2 = link1->next;
link1->next = NULL;
Link = MergeLink(MergeSort(link1),MergeSort(link2));
return Link;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: