标签:div void 代码 移动 问题 直接插入 new 接下来 效率
第八章主要学习了排序方法。而排序方法中我们又主要学习内部排序。内部排序的过程是一个逐步扩大记录的有序序列长度的过程,可分为插入类、交换类、选择类、归并类和分配类。由于代码效率的评价指标包括时间效率(比较次数与移动次数)、空间效率及稳定性,所以接下来我要一一记录下这些排序类的步骤以及从以上三个方面判断方法的优劣~
一、插入类
1.基本思想:在R[1....i-1]中查找R[i]的插入位置,R[j]<=R[i]<=R[j+1];
在R[j+1....i-1]中所有的记录后移一个位置;
将R[i]插入/复制到R[j+1]的位置上。
2.直接插入排序(基于顺序查找):!从R[i-1]往前查找,不用担心越界问题
时间复杂度:O(n^2); 空间复杂度:O(1)
3.折半插入排序:序列必须有序!
二、交换类
1.基本思想:两两比较,若发生逆序则交换,直到所有记录都排好序
2.冒泡排序:每趟不断两两比较,发生逆序就进行交换(n个数比较n-1趟);当第i趟的排序完毕,就会确定 第i个大的值
时间复杂度:最好情况下比较n-1次,不移动;最坏情况下也比较n-1次,但是要移动3(n-i)(不被选择的原因)次;是一种稳定的排序方式
3.快速排序:取任一元素为中心,将比它小的元素往前移,比它小的往后移,对形成的新子表重复此操作,直至所有记录的元素都排好序
为避免选择元素时发生左右子表数差太多的情况,我们可以对初始值的low、mid、high进行比较取中间值为中心。
三、选择类
1.基本思想:每一趟在后面n-i+1个中选出关键码最小的对象,作为有序序列的第i个
2.简单选择排序:第n-1趟排完,所有树的顺序都排好,必须是数组存储
时间复杂度为O(n^2)比较次数一直是n*(n-1)/2,移动次数最好情况下为1,最坏情况3*(n-1),空间复杂度为O(1)
3.堆排序:n个元素序列{k1,k2,k3....kn}当且仅当满足ki<=k2i&ki<=k2i+1 或者 ki>=k2i&ki>=k2i+1;
时间复杂度:o(n)=nlog_2(n) 树的深度为n;是一种不稳定的排序方式;
按非降序来排的时候建立大根堆,非升序排列的时候建立小根堆
可以解决TopK问题
四、归并排序
程序代码:
void Merge (RedType R[], int low, int high, int mid){ RedType *T=new RedType[high+1]; } void MergeSort(SqList &l){ MSort(L, 1,L.ength); }
时间复杂度:O(nlog_2 n); 空间复杂度为O(N); 可解决“外排序”问题
本章学习的内容比较容易接受,大多数都是前面的学习过程中设计接触到的,但是一些重要的排序方法,快速排序、插入排序的过程还是需要反复观看,才能记住。
离考试只剩一星期了,加油!
标签:div void 代码 移动 问题 直接插入 new 接下来 效率
原文地址:https://www.cnblogs.com/hywright/p/13286061.html