归并排序

来源:互联网 发布:淘宝怎么申请退款退货 编辑:程序博客网 时间:2024/06/05 19:54

分而治之,归并排序

算法简单易懂,第一次编写错误,误把原数组下表当做临时数组考虑,结果可想而知,访问越界


下面是正确代码

import java.util.Scanner;public class MergeSort {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubScanner scanner=new Scanner(System.in);int  n=Integer.parseInt(scanner.next());;int []a=new int[n];for (int i = 0; i < n; i++)a[i]=Integer.parseInt(scanner.next());mergeSort(a,0,n-1);for (int i = 0; i < n; i++) System.out.print(a[i]+"  ");}public static void mergeSort(int a[], int begin, int end) {if ((end-begin)>=1) {mergeSort(a, begin, begin+(end-begin)/2);mergeSort(a, begin+(end-begin)/2+1, end);merge(a, begin, begin+(end-begin)/2, end);}}public static void merge(int a[], int b, int m, int e){int []arry1=new int[m-b+1]; //temporary arrayint []arry2=new int[e-m];int i=b;int j=m+1;int k=0;for ( k = 0; k < arry1.length;) arry1[k++]=a[i++];for ( k = 0; k < arry2.length;) arry2[k++]=a[j++];i=0;j=0;for ( k = b; i<arry1.length&&j<arry2.length; k++)if(arry1[i]<arry2[j])a[k]=arry1[i++];elsea[k]=arry2[j++];while( i<arry1.length) a[k++]=arry1[i++];while( j<arry2.length)a[k++]=arry2[j++];}


#include <iostream>using namespace std;void merge(int a[],int p,int e,int m){int *la= new int [m-p+1];int *ra= new int [e-m];int j=0;int k=0;int i=0;for (i = p; i <= m; i++)la[i-p]=a[i];for (i = m+1; i <= e; i++)ra[i-m-1]=a[i];for (i= p; j<m-p+1&&k<e-m;i++)if (la[j]<ra[k])a[i]=la[j++];elsea[i]=ra[k++];while (j<m-p+1)a[i++]=la[j++];while (k<e-m)a[i++]=ra[k++];}void mergesort(int a[], int p,int e){int q=(p+e)/2;if (e-1>=p){mergesort(a,p,q);mergesort(a,q+1,e);merge(a,p,e,q);}}int main(void){const int n=10;int a[n]={2,3,1,4,0,5,8,9,7,6};mergesort(a,0,n-1);for (int i = 0; i <n; i++)cout<<a[i]<<" ";cout<<endl;}


0 0
原创粉丝点击