读《算法导论》之perface
前段时间开始读《算法导论》一书,第一次在译本软件类书看到这么大篇幅关于数学的内容,在惊讶之余更让我坚定了读完它的信念。虎头蛇尾一直是我的弱点,就像之前看《head first design pattern》一样,看了几章后,因为英语的薄弱,暂停了(不过之后我一定会细细看完的)。所以前言往往是看得最细的,呵呵(有点象中国男篮)。在前言中,主要讲了两个排序算法:插入排序和分治法(快速排序)。于是先写了个小测试,感受了两种算法的时间复杂度:
insertionsort.java
/*
* 插入排序法
*/
package com.algorithms.www;
public class insertionsort {
private ultility ut;
private int[] Array;
private void ShowArray(){
ut.PrintArray(Array);
}
protected void sort(int[] arry)
{
int key,j =0;
for(int i=1;i<=arry.length-1;i++)
{
key = arry[i];
j = i-1;
while((j>=0)&&(arry[j]>key))
{
arry[j+1]=arry[j];
arry[j] = key;
j--;
}
}
}
public void Run()
{
ut = new ultility();
Array = ut.GetIntArray(20000,20000);
ut.StartTime();
sort(Array);
System.out.println("耗时:"+ut.GetSeconds()+"毫秒");
System.out.println("----------------------------------------");
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
insertionsort is = new insertionsort();
is.Run();
is.ShowArray();
}
}
QuickSort.java
/*
* 快速排序法
*/
package com.algorithms.www;
public class QuickSort {
private final int Len = 10; //如果数组长度大于Len,则直接使用插入排序
private insertionsort IsertSorts;
private ultility ut;
private int[] Array;
private void ShowArray(){
ut.PrintArray(Array);
}
private void sort(int[] arry,int left,int right)
{
if ((arry.length -1)<= 10) {
IsertSorts.sort(arry);
}
else{
int i = left;
int j = right;
int middle = (left+right)/2;
int Temp = 0;
do{
while((arry[i] while((arry[j]>arry[middle])&&(j>middle)) j--;
if(i<=j)
{
Temp = arry[i];
arry[i] = arry[j];
arry[j]=Temp;
i++;
j--;
}
}
while(i<=j);
if(left if(right>i) sort(arry,i,right);
}
}
public void Run()
{
ut = new ultility();
Array = ut.GetIntArray(20000,20000);
ut.StartTime();
sort(Array,0,Array.length-1);
System.out.println("耗时:"+ut.GetSeconds()+"毫秒");
System.out.println("----------------------------------------");
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
QuickSort qs = new QuickSort();
qs.Run();
qs.ShowArray();
}
}
对20000个数进行排序,插入法耗时:5778ms(时间复杂度:n的平方);快速插入法:10ms(时间复杂度:nlogn)