Algorithms: Merge Sort -- 归并排序
2009-12-02 22:42
429 查看
原来 Merge Sort 的中文名字是 归并排序。《Introduction to Algorithms》上面这个方法很强势啊,用递归实现。
这里我用C和Java实现。
以前自己用C实现:
自己写了一个用来测试的 Test.inf, 文件内容: 2 4 5 7 1 2 3 6 。
在实现 merge_sort 过程中出现了一个错误:忘记加上 merge()那一行了……
囧。这样的话仅仅实现了“分”的思想,却没有“合”。
最近学的Data Structure & Algorithms accelerated,是用Java来讲课的。那么,我也用Java实现一下(Java的确是个比C优雅得多的语言)
用来Sort的class:
用来做Test的main Class:
这次用Java实现,居然前前后后花了很多时间(4h++)。主要是因为在刚刚开始做的时候,没有一个整体的思路:上来就写,边写边改,以至于效率底下,而且漏洞超多。这里要感谢Eclipse的超强的Debug功能,逐步跟踪,才能发现那么多的思维漏洞。
这里我用C和Java实现。
以前自己用C实现:
#include <stdio.h> #include <conio.h> void merge(int *A, int p, int q, int r){ int L[q-p+2], R[r-q+1]; int i,j,k; for(i=0;i<q-p+1;i++) L[i]=A[i+p]; for(i=0;i<r-q;i++) R[i]=A[q+1+i]; L[q-p+1]=32767; R[r-q]=32767; for(i=0,j=0,k=p;k<=r;k++){ if(L[i]>R[j]){ A[k]=R[j]; j++; } else{ A[k]=L[i]; i++; } } } void merge_sort(int *A, int begin, int stop){ if(begin<stop){ int r=(begin+stop)/2; merge_sort(A,begin,r); merge_sort(A,r+1,stop); merge(A,begin,r,stop); } } int main(){ FILE *indata; int A[20]; int L[8]={1,4,7,8, 2,3,4,8}; int i,t; indata=fopen("test.inf","r"); for(i=0;fscanf(indata,"%d",&A[i])!=EOF;i++); printf("The original sequence:/n "); for(t=0;t<i;t++) printf("%d ",A[t]); merge_sort(A,0,7); printf("/n/nthe sequence after merge sort:/n "); for(t=0;t<i;t++) printf("%d ",A[t]); merge(L,0,3,7); getch(); return 0; }
自己写了一个用来测试的 Test.inf, 文件内容: 2 4 5 7 1 2 3 6 。
在实现 merge_sort 过程中出现了一个错误:忘记加上 merge()那一行了……
囧。这样的话仅仅实现了“分”的思想,却没有“合”。
最近学的Data Structure & Algorithms accelerated,是用Java来讲课的。那么,我也用Java实现一下(Java的确是个比C优雅得多的语言)
用来Sort的class:
package sorting; /* Start time: 2011年1月14日23:04:07 * End time: 2011年1月17日10:25:00 */ public class Sort { public static void mergeSort(int[] a, int start, int end) { // divide int middle = (start + end) / 2; if (start < middle) mergeSort(a, start, middle); if (middle + 1 < end) mergeSort(a, middle+1, end); // conquer merge(a, start, middle, end); } private static void merge(int[] a, int start, int middle, int end) { int temp[] = new int[end - start + 1], i = 0, j = 0; for (i = 0, j = 0; i < (middle - start + 1) && j < (1 + end - (middle + 1));) { temp[i + j] = (a[start + i] <= a[middle + 1 + j]) ? a[start + (i++)] : a[middle + 1 + (j++)]; } // copy the rest while (i + j < end + 1 - start) { temp[i + j] = (start + i > middle) ? a[middle+1+j++] : a[start + i++]; } // copy back to that part of memory for (i = 0; i <= end - start; i++) a[start + i] = temp[i]; } }
用来做Test的main Class:
package sorting; import java.util.*; public class Test { public static void main(String[] args) throws Exception{ Random rand = new Random(47); int a[] = new int[20]; // temp variables int i; // initialize the array with random numbers for(i=0;i<20;i++) a[i] = rand.nextInt(100); // output initial array System.out.println("initially, the array is: "); System.out.println(Arrays.toString(a)); Sort.mergeSort(a,0,a.length-1); // output sorted array System.out.println("After merge sort, the array is:"); System.out.println(Arrays.toString(a)); } }
这次用Java实现,居然前前后后花了很多时间(4h++)。主要是因为在刚刚开始做的时候,没有一个整体的思路:上来就写,边写边改,以至于效率底下,而且漏洞超多。这里要感谢Eclipse的超强的Debug功能,逐步跟踪,才能发现那么多的思维漏洞。
相关文章推荐
- STL:原地归并排序模板(InplaceMergeSort)
- 合并(归并)排序(MergeSort)
- 【数据结构】 MergeSort与QuickSort的详细分析 - 归并排序、快速排序
- Mergesort-归并排序
- 合并(归并)排序(MergeSort)
- 归并排序:Sort:Merge sort using temporary int array(c++)
- block swaping 原地归并排序的基础(in-place parallel merge sort)
- mergesort unrecursive 归并排序的非递归实现
- 原地归并排序 Merge Sort in place
- 排序算法总结(二)归并排序【Merge Sort】
- 分治法排序 Thinking in MergeSort
- STL 源码分析《1》---- list 归并排序的 迭代版本, 神奇的 STL list sort
- 数据结构和算法分析之排序篇--归并排序(Merge Sort)和常用排序算法时间复杂度比较(附赠记忆方法)
- Merge Sort [Basic] C程序 实现排序功能
- 单链表的排序 快速排序 归并排序 quicksort mergesort
- STL 源码分析《1》---- list 归并排序的 迭代版本, 神奇的 STL list sort
- 无聊写排序之 ---- 归并排序(MergeSort) 递归实现
- STL源码——list sort:归并排序的非递归实现
- 148 Sort List (归并实现链表排序)
- [Algorithms] Sorting Algorithms (Insertion Sort, Bubble Sort, Merge Sort and Quicksort)