一、前置排序:选择排序
时间复杂度O(N^2);
void SelectSort(int A[], int n)
{
for (int j = 0; j < n - 1; j++)
{
int min = j; //确定最小元素位置
for (int i = j + 1; i < n; i++)
{
if (A[min] > A[i])
A[min] = A[i];
min = i;
}
//判断条件容易丢
if (min! = i)
swap(A[i], A[min]);
}
}
二、堆排序的构建
本质特点是一棵完全二叉树,分为大根堆与小根队
1.建立大根堆
// 1.建立大根堆
void BuildMaxHeap(int A[], int len)
{
for (int i = len / 2; i > 0; i--)
//从后往前调整所有非终端结点
{
HeadAjust(A, i, len); //一次大根堆,摆好一次数据
}
}
//将以K为根的子树调整为大根堆
void HeadAdjust(int A[], int k, int len)
{
A[0] = A[k]; //暂存
for (int i = 2 * k; i <= len; i *= 2) //从子结点开始,这里有防止溢出的判断操作
{
//检查孩子节点,看是否最大,不一定啊
if (i < len && A[i] < A[i + 1])//这一步稳定性体现
i++; //选取子树较大值的下标
if (A[0] >= A[i])
break; //若比它最大子节点都大,跳出循环
else
{
A[k] = A[i];
k = i; //重点是这一步,修改k值z,这里k要重新处理
}
}
A[k] = A[0]; //被筛选结点的值放入最终位置
}
2.基于堆排序进行排序
void HeapSort(int A[], int len)
{
BuildMaxHeap(int A[], int len);
for (int i = len; i > 1; i--)
{
swap(A[i], A[1]);
HeadAdjust(int A[], int k, int len);
}
}
3.时间复杂度分析
时间复杂度
建立堆,关键字对比次数,不超过4n,时间复杂度 O(n),复杂算的
关键字对比,O(h)
排序时间复杂度O(nlogn)
总体上不稳定
三.堆排序的插入与删除
插入:与父节点进行交换比较,交换后的节点再与父节点交换比较,直至符合条件为止
删除:把表尾节点交给删除节点的位置,然后往下比较进行符合堆排序条件的交换,直至符合条件为止
考点再与步骤和比较次数