归并排序
真的没有想到,以前不曾关注的归并排序原来是这么的复杂。其实,快速排序、堆排序以及归并排序都用到了递归思想,难点就是找出递归形式和递归出口。然而,归并排序还是实际中能够应用到的一种算法--分布式处理。因为,现实中,数据量会比较大,超出一台计算机的内存上限是可能的,这就需要将数据分配到若干台计算机上并行计算。这和现在正在学习的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; }