原创 算法导论chapter2的笔记

2008-3-31 21:09 4414 6 6 分类: 软件与OS
算法导论的笔记,其实不算笔记,因为我比较懒,懒的写什么文字的笔记,书上的题目有很多是数学型的,计算型的,基本上都做了下,不过只是在稿纸上算的,懒得打字敲上来了,下面只是那些涉及到的算法,用C实现的代码
------------------------------------------------------------------------------------------------------

// chapt2.cpp : Defines the entry point for the console application.
//

/*************************************************************
**  CLRS Introduction to Algorithm(2nd) chapter 2
** study notes
** by lzp<
bluefeynman@gmail.com>
** 2007-10
**************************************************************/
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include <time.h>

 

/*插入排序,按照升序*/
void InsertionSortAscend(int *array,int len)
{
 int i,j;
 int key;
 for(i=1;i<len;i++)
 {
  key=array;
  j=i-1;
  while(j>=0&&array[j]>key)
  {
   array[j+1]=array[j];
   j--;
  }
  array[j+1]=key;
 }
}

/*插入排序,按照降序*/
void InsertionSortDescend(int * array, int len)
{
 int i,j;
 int key;
 for(i=1;i<len;i++)
 {
  key=array;
  j=i-1;
  while(j>=0&&array[j]<key)
  {
   array[j+1]=array[j];
   j--;
  }
  array[j+1]=key;
 }
}
//选择排序,按照升序
void SelectionSortAscend(int *array,int len)
{
 int key,i,j,tmp,index;
 for(i=0;i<len-1;i++)
 {
  key=array;
  index=i;
  for(j=i+1;j<len;j++)
  {
   if(key>array[j])
   {
    key=array[j];
    index=j;
   }
  }
  tmp=array;
  array=key;
  array[index]=tmp;
 }
}

/**********************************
**合并排序,按照升序
**这是一个递归实现,时间复杂度O(nlogn)
**其中Merge(...)是个辅助函数,用来将
**两个已经排好序的数组合并成一个大的排好序
**的数组
**Merge(..)参数含义:
array---待排序的数组,但是其中array[p..q]和
array[q+1..r]是已经排好的两个子数组
************************************/
bool Merge(int *array,int p,int q,int r)
{
 int i,j,k;
 int len1=q-p+1;
 int len2=r-q;
 int *left,*right;
 if((left=(int*)malloc(sizeof(int)*len1))==NULL)
  return false;
 if((right=(int *)malloc(sizeof(int)*len2))==NULL)
 {
  free(left);
  return false;
 }
 for(i=0;i<len1;i++)
 {
  left=array[p+i];
 }
 for(j=0;j<len2;j++)
 {
  right[j]=array[q+1+j];
 }
 for(i=0,j=0,k=p;i<len1&&j<len2;k++)
 {
  if(left<right[j])
  {
   array[k]=left;
   i++;
  }
  else
  {
   array[k]=right[j];
   j++;
  }
 }
 for(;i<len1;i++,k++)
 {
  array[k]=left;
 }
 for(;j<len2;j++,k++)
 {
  array[k]=right[j];
 }
 free(left);
 free(right);
 return true;
}

bool MergeSortAscend(int *array, int p,int r)
{
 int q;
 if(p<r)
 {
  q=(p+r)/2;
  if(!MergeSortAscend(array,p,q))
   return false;
  if(!MergeSortAscend(array,q+1,r))
   return false;
  if(!Merge(array,p,q,r))
   return false;
 }
 return true;
}

/******************************************
**
**二分查找
** arguments:
*** array---a sorted array
*** len---the length of array
*** x--- the number we want to search in array
**return:
** -1---x No exist in array
** others--the index(position) of x in array
********************************************/
int BinarySearch(int *array,int len,int x)
{
 int pos="len/2";
 int left="0";
 int right="len-1";

 while(1)
 {
  if(x>array[pos])
  {
   if(pos==left)
    return -1;
   left=pos;
   pos=(pos+right)/2;
  }
  else if(x<array[pos])
  {
   if(right==pos)
    return -1;
   right=pos;
   pos=(pos+left)/2;
  }
  else
   return pos;
 }
 return -1;
}

//递归实现
int BinarySearchIter(int *array,int x,int p, int r)
{
 int j;
 if((p>=r-1)&&(array[r]!=x)&&(array

!=x))
  return -1;
 j=(r+p)/2;
 if(x<array[j])
  return BinarySearchIter(array,x,p,j);
 else if(x>array[j])
  return BinarySearchIter(array,x,j,r);
 else
  return j;
}


/******************************************************************

**2.3-7这个题目:请给出一个运行时间为O(nlgn)的算法,使之能在给定的一个由n个整数构成的

**集合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素

*******************************************************************/

/******************************************************************

**答案如下懒,没写具体代码)

**先用合并排序法把S排序,这个步骤是O(nlgn)的

**再for(i=0;i<n;i++)

** a="x-S";

**对a用二分查找看S中存在与否,这个步骤是lgn的,因为for(i=0;i<n;i++)要循环n次

**所以整个是O(nlgn)的

**这样算法整体上是O(nlgn)的

*******************************************************************/
int main(int argc, char* argv[])
{
 //test InsertionSortAscend
 int a[100];
 int i;
 srand( (unsigned)time( NULL ) );

 for(i=0;i<100;i++)
 {
  a=rand();
 }
 printf("before sort, array is:\n");
 for(i=0;i<100;i++)
 {
  printf("%d\t",a);
 }
 printf("\n");
 InsertionSortAscend(a,100);
 printf("after InertionSortAscend, array is:\n");
 for(i=0;i<100;i++)
 {
  printf("%d\t",a);
 }
 printf("\n");
 
 //test InsertionSortDescend
 InsertionSortDescend(a,100);
 printf("after InertionSortDescend, array is:\n");
 for(i=0;i<100;i++)
 {
  printf("%d\t",a);
 }
 printf("\n");
 //test  SelectionSortAscend
 SelectionSortAscend(a,100);
 printf("after SelectionSortAscend, array is:\n");
 for(i=0;i<100;i++)
 {
  printf("%d\t",a);
 }
 printf("\n");

 //test MergeSortAscend
 srand( (unsigned)time( NULL ) );

 for(i=0;i<100;i++)
 {
  a=rand();
 }
 printf("before sort, array is:\n");
 for(i=0;i<100;i++)
 {
  printf("%d\t",a);
 }
 printf("\n");
 if(!MergeSortAscend(a,0,99))
 {
  printf("MergeSortAscend error\n");
  return 1;
 }
 printf("after MergeSortAscend, array is:\n");
 for(i=0;i<100;i++)
 {
  printf("%d\t",a);
 }
 printf("\n");
 //test BinarySearch
 int x;
 
 for(x=0;x<10000;x++)
 {
  i=BinarySearch(a,100,x);
  switch(i)
  {
  case -1:
  // printf("%d don't find in array\n",x);
   break;
  default:
   printf("find %d in array's position :%d\n",x,i);
   break;
  }
 }
 printf("test BinarySearchIter\n");
 for(x=0;x<10000;x++)
 {
  i=BinarySearchIter(a,x,0,99);
  switch(i)
  {
  case -1:
   //printf("%d don't find in array\n",x);
   break;
  default:
   printf("find %d in array's position :%d\n",x,i);
   break;
  }
 }
 
 return 0;
}

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条