您的位置:首页 > 其它

《程序设计实践》读书笔记一

2008-11-15 14:31 232 查看
作者:朱金灿
来源:http://blog.csdn.net/clever101




#include <stdio.h>

#include <string.h>

char *flab[] =

{

"actually",

"just",

"quite",

"really",

NULL

};

// 顺序检索法算法

int lookup(char *word,char *array[])

{

int i;

for (i =0;array[i]!=NULL;i++)

{

if (strcmp(word,array[i])==0)

{

return i;

}

}

return -1;

}

int main(int argc, char* argv[])

{

printf("%d/n",lookup("quite",flab));

return 0;

}

typedef struct Nameval Nameval;

struct Nameval

{

char *name;

int value;

};

Nameval htmlchars[] =

{

"AElig", 0x00c6,

"Aacute", 0x00c1,

"Acirc", 0x00c2,

"zeta", 0x03b6

};

// 二分检索法源码

int lookup2(char *name,Nameval tab[],int ntab)

{

int low,high,mid,cmp;

low =0;

high = ntab-1;

while(low<=high)

{

mid = (low+high) /2;

cmp = strcmp(name,tab[mid].name);

if (cmp<0)

high = mid -1;

else if(cmp>0)

low = mid + 1;

else

return mid;

}

return -1;

}



二分检索只能用在元素已经排好序的数组上。如果需要对某个数据集反复进行检索,先把它排序,然后再用二分检索就会是很值得的。如果数据集事先已经知道,写程序时就可以直接将数据排好序,利用编译时的初始化构建数组。

最好的排序算法之一是快速排序(quicksort)。快排的工作方式是:
从数组中取出一个元素(基准值)。
把其他元素分为两组:
“小的”是那些小于基准值的元素;
“大的”是那些大于基准值的元素。
递归地对这两个组做排序。

快排算法的一种实现如下:



void quicksort(int v[],int n)

{

int i,last;

if(n<=1)

return;

// 随机抽取数组的元素作为基准元素,并将它和第一个元素交换

swap(v,0,rand()%n);

last = 0; // 用于保存基准元素应该放置的位置

// 以基准元素为界,将数组元素分为两组

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

{

if (v[i]<v[0])

{

swap(v,++last,i);

}

}

// 将基准元素放在数组准确的位置中

swap(v,0,last);

// 对数组的前一部分进行快速排序

quicksort(v,last);

// 对数组的后一部分进行快速排序

quicksort(v+last+1,n-last-1);

}


这时我脑海中产生的一个问题是:在一般情况下采用快排+二分检索是不是就比顺序检索快呢?思考:使用循环方式实现快排算法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: