算法导论开始引入的两个最基本和经典的算法,用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);
}
}


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

3909

被折叠的 条评论
为什么被折叠?



