第八章我们了解的主要是排序,这一章还是挺难的,特别是快速排序和堆排序等等部分对于我来说还是理解欠佳,得多看看这一部分的内容。
对于这一部分的内容,我们主要对算法,内容还有时间和空间复杂度等方面去进行学习的。
在这一部分的归纳中,我在网上找到了以为博主的归纳表,我觉得很详细,就在这里借用了:
下面我们分开来讲
首先在插入排序中:
直接插入排序和折半插入排序,前者是用于顺序和链式存储,而后者是只适用于顺序,前者对于记录无序,n较大时时间开销比较大,而后者则不会。
然后是希尔排序:
void ShellPass(SeqList R,int d) {//希尔排序中的一趟排序,d为当前增量 for(i=d+1;i<=n;i++) //将R[d+1..n]分别插入各组当前的有序区 if(R[ i ].key<R[i-d].key){ R[0]=R[i];j=i-d; //R[0]只是暂存单元,不是哨兵 do {//查找R的插入位置 R[j+d]=R[j]; //后移记录 j=j-d; //查找前一记录 }while(j>0&&R[0].key<R[j].key); R[j+d]=R[0]; //插入R到正确的位置上 }
这里是希尔算法的另外一种代码方法,应该书中的代码对比来看。
然后对于这样一种算法,跳跃式的移动,只适用于顺序结构,记录的总次数比直接插入要少,n越大时越明显越明显。
冒泡排序:
可用于链式,数据多时不建议使用。
快速排序:
这里也是非顺次的移动导致不稳定,适用于无顺且n较大时的情况。
选择排序:堆排序
步骤是 调整堆,建出堆和算法实现
这里不是很熟,要多回归课本,加深理解。
归并排序:
注意时间复杂度是O(nlogn);还有也是适用于链式和顺序,不需要加载存储空间。
作业的一些错题的整理:
外排序的瓶颈在于将记录从输入缓冲区归并入输出缓冲区。
就排序算法所用的辅助空间而言 堆排序 < 快速排序 < 归并排序
另外,第八章实践一要多看书,回归课本,加深理解。
原文:https://www.cnblogs.com/ckie111/p/13290830.html