看到两篇好题解,我想进行说明。
归并排序是一种基于分治思想的排序算法,它将一个大的无序数组分成两个小的有序数组,然后再将这两个小的有序数组合并成一个大的有序数组。归并排序的时间复杂度是O(nlogn),空间复杂度是O(n),是一种稳定的排序算法。
归并排序的具体步骤如下:
如果数组长度小于等于1,直接返回该数组,不需要排序。
否则,将数组从中间分成两部分,分别对左右两部分递归地进行归并排序。
然后,将排好序的左右两部分合并成一个新的有序数组,方法是使用两个指针分别指向左右两部分的起始位置,比较指针所指向的元素的大小,将较小的元素放入新数组中,并移动指针到下一个位置,直到某一部分全部放入新数组中,再将另一部分剩余的元素依次放入新数组中。
最后,返回新数组作为结果。
本题满足归并排序的要求(即使元素大小关系不具传递性)
可以用std::stable_sort实现。
另一篇题解。
二分插入排序是一种改进的插入排序算法,它的基本思想是在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到找到合适的位置插入第i个元素。这样可以减少比较次数,提高排序效率。
二分插入排序的平均时间复杂度是O (n log n),空间复杂度是O (1),排序方式是In-place,稳定性是稳定的。
二分插入排序的实现逻辑如下:
从第一个元素开始,该元素可以认为已经被排序
取出下一个元素,在已经排序的元素序列中二分查找到第一个比它大的数的位置
将新元素插入到该位置后
重复上述两步。
我只能说惊叹于二分的巧妙,//这里引用一下大佬题解
本题与一般排序有三个区别:
其一是交互式,你并不知道大小关系,只能通过调用compare接口询问;
其二是大小不具备传递性,比如a < b,b < c 并不能推出a < c;
其三是不能超过一万次询问,数据范围为1000,nlogn略小于一万,而CBA算法在最坏情况下的下界也就是nlogn。
对于其第二个性质仅仅导致答案不唯一,题目仅要求输出一种答案,所以可以忽视该条件。采用二分插入排序解决该问题,首先将第一个元素压入向量里,然后二分查找合适的位置r,将待插入元素插入到向量末尾,从后往前不断交换相邻的两个数直到待插入的元素到达指定位置。注意该二分算法的写法,循环退出时l比r大一,意味着r位置的必然小于待插入的元素,r+1及其之后的元素都大于待插入的元素。(比yxc大佬的代码更加简练了一点,因为我觉得mid=1+r+1>>2以致于代码最后还要多一次判断不容易理解,不如直接在循环里就判断好了,后面插入到末尾后只用不断前移,不用再进行判断了)。
作者:昂昂累世士
链接:https://www.acwing.com/solution/content/1009/
来源:AcWing
CBA算法是一种基于关联规则进行分类的算法,它利用了Apriori算法挖掘出的满足最小支持度和最小置信度的类关联规则(Class Association Rules),然后根据这些规则构建一个分类器。CBA算法可以看作是一种集成挖掘算法,它结合了关联规则挖掘和分类规则挖掘的优点,通常比传统的决策树分类算法如C4.5更准确。
CBA算法的主要步骤如下:
对数据集中的连续属性进行离散化,将所有属性值映射为正整数。
用Apriori算法生成所有满足最小支持度和最小置信度的类关联规则,即右部只包含类标签的规则。
从所有类关联规则中选择最优的规则作为可能规则(Possible Rules),即对于相同条件部分(左部)的规则,只保留置信度最高的一个。
从所有可能规则中选择最优的规则作为精确规则(Certain Rules),即满足最小置信度的规则。
根据精确规则构建一个分类器,按照置信度和支持度的降序对规则进行排序,对于每个测试样本,按照顺序匹配规则,直到找到一个符合条件部分的规则,然后将其划分为该规则的类标签。如果没有找到匹配的规则,则使用默认类别,即训练集中出现次数最多的类别。
std::stable_sort是一个C++标准库中的函数,它用于对一个范围内的元素进行排序。它和std::sort的区别是,std::stable_sort可以保证相等的元素在排序后保持原来的相对顺序,而std::sort则不一定。
std::stable_sort的语法格式有两种:
template< class RandomIt > void stable_sort( RandomIt first, RandomIt last );
template< class RandomIt, class Compare > void stable_sort( RandomIt first, RandomIt last, Compare comp );
其中,first和last是随机访问迭代器,它们指定了要排序的范围。comp是一个可选的比较函数或者函数对象,它用于自定义排序规则。如果不指定comp,那么默认使用operator<进行比较。
std::stable_sort的时间复杂度是O(nlogn),空间复杂度是O(n),其中n是要排序的元素个数。
std::stable_sort的实现原理是基于归并排序算法,它先将要排序的范围分成若干个小段,然后对每个小段进行插入排序,再将这些有序的小段合并成一个大的有序范围。