您的位置:首页 > 编程语言 > Go语言

Algorithms: Merge Sort -- 归并排序

2009-12-02 22:42 429 查看
原来 Merge Sort 的中文名字是 归并排序。《Introduction to Algorithms》上面这个方法很强势啊,用递归实现。

这里我用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功能,逐步跟踪,才能发现那么多的思维漏洞。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: