前言
最近在刷PAT甲级题目,遇到相应不熟的知识点而记之,以备考前回顾。
Insertion sort(直接插入排序)
思想:在一个长为n的数组中,前边一部分为已排序的数组,后面的为未排序的数组,每次遍历都从后面添加一个到前面中的合适位置。
code:
void insertion(int a[])
{
for(int i=0;i<a.size();i++)
{
sort(a.begin(),a.begin()+i);
}
}
Heap sort(堆排序)
思想:
将一个长为n的序列构造成一个大顶堆,则整个序列的最大值就是堆顶的根结点。 将最大值结点与末尾结点的值互换,此时末尾结点的值就是最大值。(即数组的最后一个元素为最大值)
然后将剩余的 n-1个序列重新构造成一个大顶堆,再将n-1序列的最大值与末尾结点的值互换,就会得到 次最大值。 如此重复执行,就可以得到一个有序序列了。
code:
void heap(int high)
{
int i=1,j=i*2;
while(j<=high)
{
if(j+1<=high&&a[j]<a[j+1]) j=j+1; //如果右孩子存在并且右孩子比左孩子大,交换的元素就用右孩子来代替;
if(a[i]>=a[j]) break; //此时已经换到合适的位置了,所以退出
swap(a[i],a[j]);
i++;j=i*2;
}
}
//默认数组a的元素从1开始放置。