- 算法设计与分析
- 主页
- 算法基础
- 算法设计与分析 - 算法导论
- 算法设计与分析 - 算法分析
- 算法设计与分析 - 分析方法
- 算法设计与分析 - 渐近记号与先验分析
- 算法设计与分析 - 时间复杂度
- 算法设计与分析 - 主定理
- 算法设计与分析 - 空间复杂度
- 分治法
- 算法设计与分析 - 分治算法
- 算法设计与分析 - 最大最小问题
- 算法设计与分析 - 归并排序算法
- 算法设计与分析 - Strassen矩阵乘法
- 算法设计与分析 - Karatsuba算法
- 算法设计与分析 - 汉诺塔
- 贪心算法
- 算法设计与分析 - 贪心算法
- 算法设计与分析 - 旅行商问题
- 算法设计与分析 - Prim最小生成树
- 算法设计与分析 - Kruskal最小生成树
- 算法设计与分析 - Dijkstra最短路径算法
- 算法设计与分析 - 地图着色算法
- 算法设计与分析 - 分数背包问题
- 算法设计与分析 - 带截止日期的作业调度
- 算法设计与分析 - 最优合并模式
- 动态规划
- 算法设计与分析 - 动态规划
- 算法设计与分析 - 矩阵链乘法
- 算法设计与分析 - Floyd-Warshall算法
- 算法设计与分析 - 0-1背包问题
- 算法设计与分析 - 最长公共子序列算法
- 算法设计与分析 - 使用动态规划的旅行商问题
- 随机化算法
- 算法设计与分析 - 随机化算法
- 算法设计与分析 - 随机化快速排序算法
- 算法设计与分析 - Karger最小割算法
- 算法设计与分析 - Fisher-Yates洗牌算法
- 近似算法
- 算法设计与分析 - 近似算法
- 算法设计与分析 - 顶点覆盖问题
- 算法设计与分析 - 集合覆盖问题
- 算法设计与分析 - 旅行商问题近似算法
- 排序技术
- 算法设计与分析 - 冒泡排序算法
- 算法设计与分析 - 插入排序算法
- 算法设计与分析 - 选择排序算法
- 算法设计与分析 - 希尔排序算法
- 算法设计与分析 - 堆排序算法
- 算法设计与分析 - 桶排序算法
- 算法设计与分析 - 计数排序算法
- 算法设计与分析 - 基数排序算法
- 算法设计与分析 - 快速排序算法
- 搜索技术
- 算法设计与分析 - 搜索技术介绍
- 算法设计与分析 - 线性搜索
- 算法设计与分析 - 二分搜索
- 算法设计与分析 - 插值搜索
- 算法设计与分析 - 跳跃搜索
- 算法设计与分析 - 指数搜索
- 算法设计与分析 - 斐波那契搜索
- 算法设计与分析 - 子列表搜索
- 算法设计与分析 - 哈希表
- 图论
- 算法设计与分析 - 最短路径
- 算法设计与分析 - 多阶段图
- 算法设计与分析 - 最优代价二叉搜索树
- 堆算法
- 算法设计与分析 - 二叉堆
- 算法设计与分析 - 插入方法
- 算法设计与分析 - 堆化方法
- 算法设计与分析 - 删除方法
- 复杂度理论
- 算法设计与分析 - 确定性与非确定性计算
- 算法设计与分析 - 最大团
- 算法设计与分析 - 顶点覆盖
- 算法设计与分析 - P类和NP类
- 算法设计与分析 - Cook定理
- 算法设计与分析 - NP难和NP完全类
- 算法设计与分析 - 爬山算法
- 算法设计与分析有用资源
- 算法设计与分析 - 快速指南
- 算法设计与分析 - 有用资源
- 算法设计与分析 - 讨论
堆排序中的插入操作
为了将一个元素插入堆中,新的元素首先被添加到堆的末尾,作为数组的最后一个元素。
插入此元素后,堆属性可能被破坏,因此通过将添加的元素与其父元素进行比较并将添加的元素向上移动一级,与父元素交换位置来修复堆属性。此过程称为 **向上筛选**。
重复比较,直到父元素大于或等于正在筛选的元素。
Algorithm: Max-Heap-Insert (numbers[], key) heapsize = heapsize + 1 numbers[heapsize] = -∞ i = heapsize numbers[i] = key while i > 1 and numbers[Parent(numbers[], i)] < numbers[i] exchange(numbers[i], numbers[Parent(numbers[], i)]) i = Parent (numbers[], i)
分析
最初,元素被添加到数组的末尾。如果它违反了堆属性,则元素将与其父元素交换。树的高度为 **log n**。最多需要执行 **log n** 次操作。
因此,此函数的复杂度为 **O(log n)**。
示例
让我们考虑一个最大堆,如下所示,其中需要添加一个新元素 5。
最初,55 将被添加到此数组的末尾。
插入后,它违反了堆属性。因此,需要将元素与其父元素交换。交换后,堆如下所示。
元素再次违反了堆属性。因此,它与其父元素交换。
现在,我们必须停止。
示例
以下是此操作在各种编程语言中的实现:
#include <stdio.h> void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } int parent(int i) { if (i == 0) return -1; else return (i - 1) / 2; } void maxHeapInsert(int arr[], int* heapSize, int key) { (*heapSize)++; int i = *heapSize; arr[i] = key; while (i > 1 && arr[parent(i)] < arr[i]) { swap(&arr[i], &arr[parent(i)]); i = parent(i); } } int main() { int arr[100] = { 50, 30, 40, 20, 15, 10 }; // Initial Max-Heap int heapSize = 5; // Current heap size // New element to be inserted int newElement = 5; // Insert the new element into the Max-Heap maxHeapInsert(arr, &heapSize, newElement); // Print the updated Max-Heap printf("Updated Max-Heap: "); for (int i = 0; i <= heapSize; i++) printf("%d ", arr[i]); printf("\n"); return 0; }
输出
Updated Max-Heap: 50 30 40 20 15 10 5
#include <iostream> #include <vector> using namespace std; void swap(int& a, int& b) { int temp = a; a = b; b = temp; } int parent(int i) { if (i == 0) return -1; else return (i - 1) / 2; } void maxHeapInsert(vector<int>& arr, int& heapSize, int key) { heapSize++; int i = heapSize; // Resize the vector to accommodate the new element arr.push_back(0); arr[i] = key; while (i > 1 && arr[parent(i)] < arr[i]) { swap(arr[i], arr[parent(i)]); i = parent(i); } } int main() { vector<int> arr = { 50, 30, 40, 20, 15, 10 }; // Initial Max-Heap int heapSize = 5; // Current heap size // New element to be inserted int newElement = 5; // Insert the new element into the Max-Heap maxHeapInsert(arr, heapSize, newElement); // Print the updated Max-Heap cout << "Updated Max-Heap: "; for (int i = 0; i <= heapSize; i++) cout << arr[i] << " "; cout << endl; return 0; }
输出
Updated Max-Heap: 50 30 40 20 15 10 5
import java.util.Arrays; public class MaxHeap { public static void swap(int arr[], int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static int parent(int i) { if (i == 0) return -1; else return (i - 1) / 2; } public static void maxHeapInsert(int arr[], int heapSize, int key) { heapSize++; int i = heapSize - 1; // Adjust the index for array insertion arr[i] = key; while (i > 0 && arr[parent(i)] < arr[i]) { swap(arr, i, parent(i)); i = parent(i); } } public static void main(String args[]) { int arr[] = { 50, 30, 40, 20, 15, 10 }; // Initial Max-Heap int heapSize = 5; // Current heap size // New element to be inserted int newElement = 5; // Insert the new element into the Max-Heap maxHeapInsert(arr, heapSize, newElement); // Print the updated Max-Heap System.out.print("Updated Max-Heap: "); for (int i = 0; i <= heapSize; i++) System.out.print(arr[i] + " "); System.out.println(); } }
输出
Updated Max-Heap: 50 30 40 20 15 5
def swap(arr, i, j): arr[i], arr[j] = arr[j], arr[i] def parent(i): if i == 0: return -1 else: return (i - 1) // 2 def max_heap_insert(arr, heap_size, key): heap_size += 1 i = heap_size arr.append(key) while i > 0 and arr[parent(i)] < arr[i]: swap(arr, i, parent(i)) i = parent(i) if __name__ == "__main__": arr = [50, 30, 40, 20, 15, 10] # Initial Max-Heap heap_size = 5 # Current heap size # New element to be inserted new_element = 5 # Insert the new element into the Max-Heap max_heap_insert(arr, heap_size, new_element) # Print the updated Max-Heap print("Updated Max-Heap:", arr)
输出
Updated Max-Heap: [50, 30, 40, 20, 15, 10, 5]
广告