《程序设计实践》读书笔记一
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);
}
这时我脑海中产生的一个问题是:在一般情况下采用快排+二分检索是不是就比顺序检索快呢?思考:使用循环方式实现快排算法。
来源: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);
}
这时我脑海中产生的一个问题是:在一般情况下采用快排+二分检索是不是就比顺序检索快呢?思考:使用循环方式实现快排算法。
相关文章推荐
- 《程序设计实践》读书笔记第五至六章
- 《程序设计实践》读书笔记一
- 《程序设计实践》读书笔记第七至八章
- 《程序设计实践》读书笔记第一至二章
- 《程序设计实践》读书笔记第三至四章
- 《程序设计实践》读书笔记第九至附录
- 《程序设计实践》读书笔记下载~
- 《Linux程序设计》读书笔记:进程间通信:管道
- 【读书笔记】Windows CE嵌入式系统_【5】_进程间通讯u
- 大话设计模式 读书笔记
- 不要在Unix下遍桌面程序(1)《精通Unix下C语言与项目实践》读书笔记(9) 推荐
- 《深度探索C++对象模型》读书笔记 (2)
- 《腾讯传》读书笔记
- GNU_linux编程指南读书笔记2 --输入 输出
- 【读书笔记】—时间管理小强升职记
- 《Effective java》-----读书笔记
- 【读书笔记】重要的东西
- 《人工智能的未来》读书笔记
- 读书笔记 effective c++ Item 22 将数据成员声明成private
- Solaris 10 Advance Administrator 310-202 读书笔记 第八章 ---- Describing RAID and the Solaris™ Volume Manager Software