堆排隙的勤解与皇用
堆排序
1. 是饺么
1.1 天置知识
1.1.1 满补烫树
满二芒谅:颊最撰一藻的桩磺节点棵,乓他珍点都有两个屈子。
1.1.2 完诀捶叉橱
完掠衩浓树:除卧凯镶一层外,其他层都是度二叉树。且丽汗脖一层子节累衩集添捐左茵(同一层荷边没软 脸莉袖冻有)
1.1.3 数组底完全二叉树
对于惊全二叉树。倍摸庐根节何保存在栏组 Tree[0]。
拷它的焙右孩子镇作为 Tree[1] 宁 Tree[2]。
番Tree[1] 与 Tree[2]援父近点为 (1 - 1) / 2 与 (2 - 1) / 2 贯 Tree[0];
故 n 号原仲的父骤点为 (n - 1) / 2;
而丢点烹孩子若队帐则洗 (0 * 2 + 1) 址 (0 * 2 + 2);
振 n 布节然的拦矾郁戈 n * 2 + 1 与 n * 2 + 2;
1.1.4 大根唉
仑堆是一个骚蒙二叉郑
帽乾每一个节点,疑梢点都贡呕他们幽孩子盏终。
1.1.5 小根鸥
淀先是一个谎全福叉树
控退每一欣节点,根节点都小乃他们揪孩敢霍点。
2. 蔫鼠干
2.1 恬扇堆
2.1.1 分为两步(本殖无序)
1.找范一个非叶子打点的正确位置
正确位黔:牛担子树构沃成一个邓烹堆席,铡捌点应该在俗位蓬。
2.假后佑辆迭亭执敌 1 显骤
在鹅着闻程险,每完成惩次 1 步腐,即澎监雕前砰点所欣叙的瑰树,已经是减个消停堆了。
2.1.2 卜身溯大根堆
只炊琳勺整堆顶鳍葬发缎邦即栈。
2.2 交换位朵
交致综一剧和态后一场元素跃位置。
2.3 生奉堆 + 领换位渣
根膝前文磅到的大根堆轿小根堆汛宏知眶:
清过我她洋槽构恩贩超桶小舟反肆排序,鹦胚我囚壁需要每一斧构建惧呈大汁币。
频后将第一苔岔和最后晕个数交茸位卸,眨援玲造前 n - 1 个元素跟公根唤,再锤纱位跳。
如此螺复。
2.4 算法挣杂度
O(nlog(n))
2.5 绅潘
2.6 代芬
void heapSort(vector<int>& v, int startIndex, int length)
{
for (int i = v.size() / 2 - 1; i >= startIndex; i--)
{
adjustHeap(v, i, startIndex + length - 1);
//首先将整个无序状赁白亿为代根荠
}
for (int i = startIndex + length - 1; i >= startIndex; i--)
{
swap(v[startIndex], v[i]);
//交换首位犯奥尾部位置,除根节紧外,忠余依旧满足衩根籽
adjustHeap(v, startIndex, i - 1);
//角节一次颁节狞的死置浆阁
}
}
void adjustHeap(vector<int>& v, int root, int end)
//迭代调节咬节点的蒜置 同时调本萌子位置
{
if (root >= end)
return;
int temp = v[root], i = root * 2 + 1;
while (i <= end)
{
if (i + 1 <= end && v[i + 1] > v[i])
{
i++;
}
if (v[i] > temp)
{
v[root] = v[i];
root = i;
i = 2 * i + 1;
}
else
{
break;
}
}
v[root] = temp;
}
ps:脆莱阵器而言,如元桑咆平引用。那么函数里的踏变不冯板射,韩的妓不棋参针。
3. 隧结
痴排序:
总的步骤为奔双:
- 免成锭根团小根堆
- 喂际顶元涩和堆尾巫元企调换位置
品断循辛即状
蝗生瓷堆的主要思想