序论:感觉算法导论这本书目前不怎么适合我这样的菜鸟。于是在网上开始了解到《啊哈!算法》这本书,这本书确实很简单,比我大二学的《数据结构与算法分析》要简单的多,这门课我考了80多分。知识就是要温故而知新,这本书通俗易懂,但我打算用一些零碎的时间看完,有时间再重温一下教材。至于算法圣典——《算法导论》,还需要再等等,一是因为比较难,二是因为比较厚,目前也没那么多时间。
因为这本书是用C写的,建议大家先学C,有关C语言我也有写一些笔记,基本上看完一些基本语法,再把我的笔记和基础C算法例题消化一下就可以入门C了。
我用的编译器是Xcode,而这本书的作者,说句实话存在一些代码不友好,比如很多用户提示没有,运行效果也没怎么考虑,所以我会针对原书的代码进行一些个人的优化。
还有写博客确实浪费时间啊,适合大一时间较多的学生。我尽量完成这本书的笔记吧!
第一章 排序
第一节 桶排序
假如有11个桶,编号从0~10。而这里有n个0~10之间的整数,数字0放入编号0的桶,数字1放入编号1的桶,依次这样就行了,最后统计每个桶数字的个数。
例:输入n个0~1000之间的整数,将它们从小到大排序。
#include
int main()
{
int book[1001],i,j,t,n;
for(i=0;i<=1000;i++)
book[i]=0;
scanf("%d",&n); //输入一个数n,表示接下来有n个数
printf("请输入%d个0~1000区间的整数\n",n);
for(i=1;i<=n;i++) //循环读入n个数,并进行桶排序
{
scanf("%d",&t); //把每一个数读到变量t中
book[t]++; //进行计数,对编号为t的桶放入一个小旗子(即计数+1)
}
for(i=1000;i>=0;i--) //依次判断编号1000~0的桶
for(j=1;j<=book[i];j++) //出现几次就将桶的编号打印几次
printf("%5d",i);
printf("\n");
return 0;
}
第二节 冒泡排序
冒泡排序的基本思想:每次比较相邻的两个元素,如果它们的顺序错误就把它们交换过来。越小的越靠后。
#include
int main()
{
int a[100],i,j,t,n;
printf("请输入需要排序的整数的个数:");
scanf("%d\n",&n); //输入一个数n,表示接下来有n个数
for(i=1;i<=n;i++) //循环读入n个数到数组a中
scanf("%d",&a[i]);
//冒泡排序的核心算法
for(i=1;i<=n-1;i++) //n个数排序,只进行n-1趟比较
{
for(j=1;j<=n-i;j++)
{
if(a[j]
第三节 快速算法
#include
int a[101],n;
void quicksort(int left,int right)
{
int i,j,t,temp;
if(left>right)
return;
temp=a[left];
i=left;
j=right;
while(i!=j)
{
while(a[j]>=temp && i
快速排序最差时间复杂度为O(N^2),平均复杂度为O(NlogN)。
第四节 小哼买书
相当于情景输入n个整数(1~1000)然后排序输出,并且需要过滤重复的数字。
方法一:先去重,再按照从小到大的顺序输出。算法思想用到了桶排序。
#include
int main()
{
int a[1001],n,i,t;
for(i=1;i<=1000;i++)
a[i]=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&t);
a[t]=1;
}
for(i=1;i<+1000;i++)
{
if(a[i]==1)
printf("%d ",i);
}
return 0;
}
#include
int main()
{
int a[101],n,i,j,t;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
//开始冒泡排序
for(i=1;i<=n-1;i++)
{
for(j=1;j<=n-j;i++)
{
if(a[j]>a[j+1])
{ t=a[j];a[j]=a[j+1];a[j+1]=t; }
}
}
//去重
printf("%d ",a[1]);
for(i=2;i<=n;i++)
{
if(a[i]!=a[i-1])
printf("%d ",a[i]);
}
return 0;
}