读《算法导论》之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)

 

posted @ 2006-08-22 23:20  红心李  阅读(183)  评论(0编辑  收藏  举报