虽然久闻大名,但第一次接触算法导论,是看了网易公开课MIT的《算法导论》课,记得 第一集就讲到了插入排序和归并排序。
几个星期前也买了算法导论这本书,准备慢慢啃~
这星期主要在看前两部分,除了对于讲渐进时间、递归式分析这些东西感到云里雾里的,其它的都就
感觉越看越有觉得入迷,果然不愧是一本经典之作
好吧,开始。本文主要是用C++把书中的算法实现,以及一些笔记。
一、插入排序。
插入算法的设计使用的是增量(incremental)方法:在排好子数组A[1..j-1]后,将
元素A[ j]查入,形成排好序的子数组A[1..j]
插入排序的效率为O(n^2),在数据规模较小的时候效率较高。
最佳的情况是一个数组已经是排好序的,只需O(n)。最坏情况是输入数据是逆序的, O(n^2)。 对于一个算法,一般是考察它的最坏情况运行时间
.
伪代码:这里需要注意的是由于大部分编程语言的数组都是从0开始算起,而伪代码是从1开始的
C++实现:
template <typename T>
void insert_sort(T *begin, T *end){ // 采用了更接近C++ STL sort的调用方式
T *p,*t,key;
for(p=begin+1; p!=end; ++p){
// 把A[j]插入排好序的A[1...j-1]中
key = *p;
t=p-1;
while(t>=begin && *t>key){
*(t+1) = *t;
--t;
}
*(t+1) = key;
}
}
二、冒泡排序、选择排序、交换排序。
记得曾在刘汝佳的《算法竞赛入门经典》中看到一段代码,书上说是冒泡排序,但是却和冒泡排序的过程有点不一样。一直到最近才知道,
原来那个应该算作是交换排序。
选择排序伪代码:
冒泡排序伪代码:
// 选择排序
void select_sort(int *start,int *end){
int *p,*q,*min;
for(p=start; p<end; ++p){
min=p;
for(q=start+1; q<end; ++q){
if(*q<*min)
min=q;
}
Swap(min,p);
}
}
// 冒泡排序
void bubble_sort(int *start,int *end){
int *p,*q;
for(p=start; p<end; ++p){
for(q=end-1; q>start; --q){
if(*q<*(q-1))
Swap(q,q-1);
}
}
}
这三个排序的效率都为O(n^2)
从中可以看出,选择排序和冒泡排序都是从当前位置i的后面所有数中最小的一个数,交换到i位置中,但是选择排序只需要交换一次,冒泡排序可能会交换多次,速度应该是选择排序更快。。
除了选择排序和冒泡排序,还有一个叫”交换排序“的,思想也几乎一样,它是分别将第 i 个数 和后面的数一一比较,一旦后面的一个数比它小,就交换。
三、归并排序(合并排序)
归并排序是一种高效的排序算法,按照分治三步法:
划分问题:把序列分成元素个数尽量相等的两半
递归求解:把两半元素分别排序
合并问题:把两个有序表合并成一个
MERGE-SORT伪代码:
MERGE是关键:
这里给的代码实现是在每一堆的底部放一张“哨兵卡”,可以用于简化代码。
但是我用C++实现的方式采用另外一种形式,放“哨兵卡”虽然可以简化代码,但是这个“哨兵值”却有点局限性,在不同平台和机器下可能会不同。
// 算法导论实现版本
template<typename T>
void merge(T array[],int p,int q,int r){
int n1,n2,i,j,k;
n1=q-p+1;
n2=r-q;
T *left=new T[n1], *right=new T[n2];
for(i=0; i<n1; ++i) // 对左数组赋值
left[i] = array[p+i];
for(i=0; i<n2; ++i) // 对又数组赋值
right[i] = array[q+i+1];
i=j=0;
k=p;
while(i<n1 && j<n2){
if(left[i] <= right[j])
array[k++] = left[i++];
else
array[k++] = right[j++];
}
for( ; i<n1; ++i) //如果左数组有元素剩余,则将剩余元素合并到array数组
array[k++] = left[i];
for( ; j<n2; ++j) //如果右数组有元素剩余,则将剩余元素合并到array数组
array[k++] = right[j];
delete [] left; // 记住要释放空间
delete [] right;
}
template<typename T>
void merge_sort(T array[],int p,int r){
if(p<r){
int q = (p+r)/2;
merge_sort(array,p,q);
merge_sort(array,q+1,r);
merge(array,p,q,r);
}
}
并归排序在ACM中有个用处,可以用来求逆序数对(《算法竞赛入门经典》P144),因为如果直接枚举的效率为O(n^2)会超时。
受并归排序启发,由于合并操作是从小到大进行的,当右边的A【j】复制到T中时(这里的T是刘汝佳版的并归排序实现,后面给出),左边还没来得及复制到T得那些数就是左边所有比A【j】大的数,即A【j】的逆序数
刘汝佳神牛的并归排序+顺便求出逆序数
void merge_sort(int *A,int x,int y,int *T){ // T是专门开得一个临时数组。 这样可以大大节约了很多时间(上面的方式要多次开辟数组空间)
if(y-x > 1){
int m=x+(y-x)/2; // 划分
int p=x, q=m, i=x;
merge_sort(A,x,m,T);
merge_sort(A,m,y,T);
while(p<m || q<y){ // 非递归调用的方式还可以节省栈调用时间
if(q>=y || (p<m && A[p] <= A[q])) T[i++] = A[p++];
else { T[i++] = A[q++]; cnt += m-p; } // cnt用来计算逆序数对,用全局变量,调用前清零
}
for(i=x; i<y; ++i) A[i]=T[i];
}
}
—— 生命的意义,在于赋予它意义。
分享到:
相关推荐
报告的标题是“中科大算法导论课程实验 常见排序算法的实现与性能比较”,指出了本实验报告的重点在于实现并比较各类常见排序算法。 #### 描述解读 描述部分指明了实验的目的和范围,要求对六种排序算法——合并...
自学算法导论中前几章,并自己写的排序算法源码包括gtest的测试用例。 详细介绍看我博客 http://blog.csdn.net/ceofit 一、选择法排序、冒泡排序、插入法排序 http://blog.csdn.net/ceofit/article/details/7397020 ...
《算法导论第四版》是普林斯顿大学计算机科学系教授Robert Sedgewick和Kevin Wayne所编写的一部经典算法教材。该书深入浅出地介绍了计算机算法设计与分析的各个方面,涵盖了从基本的数据结构到复杂算法的理论知识和...
《算法导论》是计算机科学领域的一本经典著作,它深入浅出地介绍了算法的设计、分析和实现。这本书的第三版更是对前两版进行了完善和更新,涵盖了更广泛的主题和最新的研究成果。针对你提到的“算法导论第三版完整版...
本资源摘要信息是根据麻省理工学院算法导论笔记.pdf所生成的知识点,涵盖算法导论的基本概念、算法设计和分析、排序算法等方面的知识点。 算法导论 * 算法的定义:算法是解决问题的一组规则,通过有限步骤来解决...
《算法导论》是一部在计算机科学领域内广受推崇的经典教材,由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein四位作者共同编写,第二版更是对初版进行了全面的更新与扩充,涵盖了算法...
《算法导论》是计算机科学领域的一本经典著作,它为读者提供了全面而深入的算法理论与实践知识。中文第三版的出版,使得更多中国读者能够无障碍地学习这本权威教材。英文版第四版虽然在描述中提及,但主要讨论的重点...
《算法导论中文版》是一本以算法为核心内容的计算机科学教材。这本书旨在向读者介绍各种基本的算法以及它们的设计和分析方法。对于编程新手来说,该书能够帮助他们建立起对算法基础的认识,并在学习过程中形成良好的...
"算法导论(英文原版教材)" 本书《算法导论》(英文原版教材...《算法导论》(英文原版教材)是一本非常详细和系统的算法教材,涵盖了算法的基础知识、设计和分析等方面的内容,为读者提供了一个系统的算法知识体系。
算法导论上的堆排序c++源程序||学习分享
《算法导论》是计算机科学领域的一本经典著作,它由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein四位作者共同撰写,全面深入地探讨了算法的设计、分析及实现。这本书的第三版更加完善...
《算法导论》是计算机科学领域的一本经典著作,它深入浅出地介绍了算法的设计、分析和实现。中文第三版的出版,使得更多的中文读者能够接触到这本权威教材。本书覆盖了从排序和搜索到图算法,再到动态规划和贪心算法...
《算法导论》是计算机科学领域的一本经典教材,由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein四位作者共同编写,广泛应用于全球各大高校的教学中,包括知名的麻省理工学院(MIT)。...
《算法导论》是一本备受推崇的计算机科学教材,它深入浅出地介绍了算法的设计、分析和实现。这本书由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein四位作者共同撰写,是全球范围内...
《算法导论》是一本广泛认可的经典教材,深入浅出地介绍了各种算法,包括排序算法。在这里,我们将详细探讨其中涉及的几种排序算法:快速排序、堆排序、计数排序以及如何找到最大最小数和第n个数。 首先,**快速...
《算法导论》第二版是一本广泛应用于计算机科学与信息技术领域的经典教材,它深入浅出地介绍了各种核心算法,为读者提供了丰富的理论基础和实践指导。课后答案作为学习过程中的重要参考资料,可以帮助读者检验自己的...
《算法导论》是计算机科学领域的一本经典著作,它为读者提供了全面而深入的算法理论与实践知识。原书的第三版包含了丰富的更新和扩展,尤其适合对算法有深入研究的学生和专业人士。这本书涵盖了从基础到高级的各种...
根据提供的文件信息,可以看出这是一份关于《算法导论》一书习题解答的手稿或文档。虽然部分内容不太清晰,但从目录和前言部分可以推测出文档的主要内容是围绕算法的基础概念、排序算法以及相关算法分析展开的。下面...
《算法导论》是计算机科学领域的一本经典教材,它深入浅出地介绍了算法的设计、分析和实现。这本书的第二版课后答案是学习者掌握算法精髓的重要参考资料,能够帮助读者检验自己的理解,深化对算法知识的掌握。这份...