归并排序
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; }
相关文章推荐
- POJ 2299 Ultra-QuickSort (归并排序求逆序数)
- 【Java】归并排序
- POJ 1007 DNA Sorting (归并排序)
- [笔记]利用归并排序计算逆序数的个数
- 模板与泛型编程之实现(归并排序)
- poj 2229 Ultra-QuickSort (归并排序求逆序数对)
- HDU 4911 Inversion【归并排序求逆序数】
- 归并排序 MergeSort
- js算法:分治法-归并排序
- poj 2299 Ultra-QuickSort(归并排序)
- 归并排序(递归与非递归)的实现
- 单链表的归并排序
- Minimum Inversion Number(归并排序)
- [算法导论 第2章]归并排序
- 归并排序求逆序对的个数
- 归并排序求逆序对个数
- hdoj 1040 As Easy As A+B 【归并排序】
- 归并排序的java实现
- 迭代法进行归并排序