《算法导论》第2章插入排序和归并排序Java代码实现

本文分享了使用Java实现《算法导论》中的插入排序和归并排序算法过程,通过具体代码展示了两种排序算法的实现细节,并进行了随机数组测试,比较了两者的运行效率。

算法导论开始引入的两个最基本和经典的算法,用Java把伪代码实现了一遍,慢慢踩坑,动手一步步实现算法导论中和课后习题的代码。

插入排序:

public class InsertSort {

	//插入排序
	public static int[] Insert_Sort(int[] a) {
		int key = 0;
		int i=0;
		for(int j=1;j<a.length;j++) {
			key = a[j];
			//将a[j]插入到a[1....j-1]中,其中a[1...j-1]已经有序
			i=j-1;
			while(i>=0&&a[i]>key) {
				a[i+1]=a[i];
				i = i -1;
			}
			a[i+1]=key;
		}
		return a;
	}
}

归并排序:

public class MergeSort {
	//分治法,归并排序
		//递归的进行归并排序
		public static int[] Merge_Sort(int[] A,int p,int r) {
			int q=0;
			if(p<r) {
				q = (p+r)/2;
				A=Merge_Sort(A,p,q);
				A=Merge_Sort(A,q+1,r);
				A=Merge(A, p, q, r);
			}
			
			return A;
		}
		
		//归并排序每次的基本步骤
		private static int[] Merge(int A[],int p,int q,int r) {
			int n1 = q-p+1;
			int n2 = r-(q+1)+1;
			//左半数组
			int[] L = new int[n1+1];
			//右半数组
			int[] R = new int[n2+1];
			//给左右半数组赋值
			for(int i=0;i<n1;i++) {
				L[i]=A[i+p];
			}
			for(int j=0;j<n2;j++) {
				R[j]=A[j+q+1];
			}
			//哨兵位置,判断是否为空
			L[n1] = 999999999;
			R[n2] = 999999999;
			int i = 0;
			int j = 0;
			for(int k=p;k<=r;k++) {
				if(L[i]<=R[j]) {
					A[k]=L[i];
					i=i+1;
				}else {
					A[k] = R[j];
					j=j+1;
				}
			}
			return A;
		}
}

随机化数组进行测试:

import java.util.Random;
import suanfa.daolun.topic2.InsertSort;
import suanfa.daolun.topic2.MergeSort;
public class Test {
	public static void main(String[] args) {
	    int a[] = new int[5000];
	    int b[] = new int[5000];
	    Random rand = new Random();
	    
	    for(int i=0;i<a.length;i++) {
	    	a[i]= rand.nextInt(5000)+1;
	    }
	    for(int j=0;j<b.length;j++) {
	    	b[j]= a[j];
	    }
		
	    long at1= System.currentTimeMillis();
		a=MergeSort.Merge_Sort(a, 0, a.length-1);
		long at2 = System.currentTimeMillis();		
		long at = at2- at1;
		
		long bt1= System.currentTimeMillis();
		a=InsertSort.Insert_Sort(b);
		long bt2 = System.currentTimeMillis();
		long bt = bt2-bt1;
		
		System.out.println("归并排序后数组a为:");
		for(int i:a) {
        	System.out.print(i+" ");
        }
		
		System.out.println();
		System.out.println("归并排序所用时间为"+at);
		System.out.println("插入排序后数组b为:");
		for(int i:b) {
        	System.out.print(i+" ");
        }
		System.out.println();
		System.out.println("插入所用时间为"+bt);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值