关键词:
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 5 using namespace std; 6 7 //大根堆 8 9 void push_up(vector<int>&heap , int heapPosize) 10 11 int t = heapPosize; 12 while (t/2 && heap[t/2] < heap[t])///在堆里面,计数是从一开始的 13 14 swap(heap[t],heap[t/2]); 15 t = t/2; 16 17 18 void push_down(vector<int> &heap ,int heapSize, int heapPosion) 19 20 int t = heapPosion ; 21 int leftChild = heapPosion*2; 22 int rightChild = heapPosion*2+1; 23 if (leftChild <= heapSize && heap[t] < heap[leftChild]) 24 25 t = leftChild ; 26 27 if (rightChild <= heapSize && heap[t] < heap[rightChild]) 28 29 t = rightChild ; 30 31 if (t != heapPosion) 32 33 swap( heap[t] , heap[heapPosion]); 34 push_down(heap , heapSize , t); 35 36 37 void insert(vector<int>&heap ,int data, int &heapsize) 38 39 heap.push_back(data); 40 heapsize++; 41 push_up(heap,heapsize); 42 43 44 void remove_top(vector<int>&heap , int &heapsize) 45 46 swap(heap[1],heap[heapsize]); 47 heapsize--; 48 heap.pop_back(); 49 push_down(heap,heapsize,1); 50 51 int creatHeap(vector<int> &heap ) 52 53 int length = heap.size(); 54 heap.push_back(0); 55 56 for (int i = length ; i > 0 ; i --) ///将heap的长度加一,移动数据 57 58 heap[i] = heap[i-1]; 59 60 61 for(int i =1 ;i <= length ;i++) 62 63 push_up(heap,i); 64 65 printf("push_up 第%d次 :" ,i); 66 for (int j =1 ;j <= length ;j++) 67 68 printf("%d ",heap[j]); 69 70 printf("\n"); 71 72 return length; 73 74 void heap_sort(vector<int> &heap ,int heapSize) 75 76 //int heapSize = creatHeap(heap); 77 int size = heapSize; 78 for (int i = 1 ; i <= size ;++i) 79 80 swap(heap[1],heap[heapSize]); 81 heapSize--; 82 push_down(heap , heapSize , 1); 83 printf("push_down 第%d次 :" ,i); 84 for (int j =1 ;j <= size ;j++) 85 86 printf("%d ",heap[j]); 87 88 printf("\n"); 89 90 for (int i = 0 ; i < size ;i++) ///将数据还原 91 92 heap[i] = heap[i+1]; 93 94 heap.pop_back(); 95 96 #define n 5 97 int main() 98 99 vector<int> heapData; 100 heapData.resize(n); 101 for(int i = 0 ; i < n ;i++) 102 103 cin >> heapData[i]; 104 105 106 puts("排序前的数据为 :"); 107 for(int i = 0 ; i < n ;i++) 108 109 printf("%d ",heapData[i]); 110 111 printf("\n"); 112 113 int length = creatHeap(heapData); 114 remove_top(heapData,length); 115 puts("删除头节点后的值为 :"); 116 for(int i = 1 ; i <= length ;i++) 117 118 printf("%d ",heapData[i]); 119 120 printf("\n"); 121 122 puts("增加节点后的值为 :"); 123 insert(heapData ,26515, length); 124 for(int i = 1 ; i <= length ;i++) 125 126 printf("%d ",heapData[i]); 127 128 printf("\n"); 129 130 heap_sort(heapData,length); 131 puts("排序后的数据为 :"); 132 for(int i = 0 ; i < length ;i++) 133 134 printf("%d ",heapData[i]); 135 136 printf("\n"); 137 return 0; 138
最后结果为:
12
123
12323
26
23
排序前的数据为 :
12 123 12323 26 23
push_up 第1次 :12 123 12323 26 23
push_up 第2次 :123 12 12323 26 23
push_up 第3次 :12323 12 123 26 23
push_up 第4次 :12323 26 123 12 23
push_up 第5次 :12323 26 123 12 23
删除头节点后的值为 :
123 26 23 12
增加节点后的值为 :
26515 123 23 12 26
push_down 第1次 :123 26 23 12 26515
push_down 第2次 :26 12 23 123 26515
push_down 第3次 :23 12 26 123 26515
push_down 第4次 :12 23 26 123 26515
push_down 第5次 :12 23 26 123 26515
排序后的数据为 :
12 23 26 123 26515
请按任意键继续. . .
图解排序算法之堆排序(代码片段)
堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。堆 堆是具有以下性质的完全二叉树:每... 查看详情
图解排序算法之堆排序(代码片段)
预备知识堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。堆 堆是具有... 查看详情
基本排序算法之堆排序(代码片段)
1、堆的概念堆排序依赖的数据结构是完全二叉树,要想是完全二叉树,前提必须是二叉树(废话),二叉树就要求父亲结点至多有两个孩子,即可以有一个、两个或者没有孩子。完全二叉树则是在二叉树的基础上多了一些限制... 查看详情
排序算法之堆排序(代码片段)
一、原理?堆排序是采用数据结构堆进行排序的算法。堆是一种近似完全二叉树的结构,并同时满足堆的性质:子节点的键值或索引总是小于(或大于)它的父节点。?堆中定义以下几种操作:?1)最大堆调整(MaxHeapify):将堆的末端子节点... 查看详情
算法排序之堆排序
在算法导论第三版中介绍“堆排序是一种原地排序,如果试图引入数组,那么将失去这一优势。”堆排序的基础是在原有堆上进行排序,即将等待排序的集合先建堆1.建立最大堆(Max_Heapify) 最大堆满足条件A[Parent[i]]>=A[i]&n... 查看详情
重温基础算法内部排序之堆排序法(代码片段)
内部排序之堆排序法文章目录内部排序之堆排序法二叉堆定义二叉堆的特性逻辑结构存储结构数组的heapify寻找最后一个非叶子结点主要思想过程演示JAVA代码算法分析初始化堆的时间复杂度重建堆时的时间复杂度空间复杂度堆排... 查看详情
排序算法之堆排序
预备知识堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。堆 堆是具有以下性质的完全二... 查看详情
经典排序之堆排序详解(代码片段)
堆排序一、概述首先我们来看看什么叫做堆排序?若在输出堆顶的最小值之后,使得剩余的n-1个元素的序列重新又构成一个堆,则得到n个元素中的次小值,如此反复,便能得到一个有序序列,称这个过程为堆排序。再来看看总... 查看详情
基本排序算法之堆排序(代码片段)
1、堆的概念堆排序依赖的数据结构是完全二叉树,要想是完全二叉树,前提必须是二叉树(废话),二叉树就要求父亲结点至多有两个孩子,即可以有一个、两个或者没有孩子。完全二叉树则是在二叉树的基础上多了一些限制... 查看详情
图解排序算法之堆排序
预备知识堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。堆 堆是具有以下性质的完全二... 查看详情
图解排序算法之堆排序
预备知识堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。堆 堆是具有以下性质的完全二... 查看详情
[2]算法之路-选择之堆排序
题目:选择排序法的概念简单,每次从未排序部份选一最小值,插入已排序部份的后端,其时间主要花费于在整个未排序部份寻找最小值。假设能让搜寻最小值的方式加快,选择排序法的速率也就能够加快Heap排序法让搜寻的路... 查看详情
排序算法之堆排序(优先队列)
1、堆排序的堆,其实是一个完全二叉树。既是一个结点要么是叶子结点,要么必定有左右两个子节点的树。2、堆有序:每个结点的值,都必须大于两个子节点。但是两个子结点的大小不作要求。3、一棵大小为N的完全二叉树,... 查看详情
排序之堆排序(代码片段)
堆排序的基本思想(小顶堆)1)先将初始排列关键字序列(R1,R2...,Rn-1,Rn)构成小顶堆,此堆为初始的无序区.(这里是从最后一个非叶结点向前进行赛选)2)将堆顶元素R1与最后一个元素Rn交换,此时得到新的无序区(R1,R2...,Rn-1)和新的有序... 查看详情
superhakce春招备战算法实践之堆排序
HeapSort堆排序 堆排序是一种树形选择排序方法,它的特点是:在排序的过程中,将array[0,...,n-1]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲节点和孩子结点之间的内在关系,在当前无序区中选... 查看详情
算法三之堆排序
一、堆(Heap)定义(1)n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质): k(i)<=k(2i)且k(i)<=k(2i+1)(1≤i≤n/2), 当然,这是小根堆,大根堆则换成>... 查看详情
排序之堆排序(代码片段)
排序是将一串数据按照其某个或者某些关键字的大小进行递增或递减排列的操作我,通常指的排序是升序,排序方式是原地排序下面介绍下堆排序堆排序原理:堆排序也是选择出无序区间的最大值/最小值,将其放在无序区间的... 查看详情
数据结构之堆排序
ppt(原创):https://files.cnblogs.com/files/eastblue/堆排序.pptx视频(原创):https://www.bilibili.com/video/av16199074/代码:#include<cstdio>#include<cstring>constintmaxn=1e9+7;intb[50050];voidfun(inta[], 查看详情