我的排序
来源:互联网 发布:什么是淘宝店铺运营 编辑:程序博客网 时间:2024/06/01 09:19
我的排序
第一个: 堆排
知识标签: heap, sort, algorithm
该代码实现了用大顶堆排序、向大顶堆插入元素、删除大顶堆堆顶元素
大顶堆code
#include<iostream>void adjustup(int A[], int k){// 多次向上调整以第k个元素开始的子树,直到符合大顶堆的要求 A[0] = A[k]; int i = k/2; while(i > 0 && A[i] < A[0]) { A[k] = A[i]; k = i; i = k/2; } A[k] = A[0];}void adjustDown(int A[], int k, int len){// 向下调整以第k个元素开始的子树,使其符合大顶堆的要求 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; } } A[k] = A[0];}void buildMaxHeap(int A[], int len){ //从第len/2个元素开始,一直到堆顶元素,向下调整堆,建立大顶堆 for(int i = len/2; i > 0; --i) adjustDown(A, i, len);}void heapsort(int A[], int len){// 堆排 // 建大顶堆 buildMaxHeap(A, len); //依次把堆顶元素向数组后放,并向下调整堆,最终得到从小到大的数组 for(int i = len; i > 1; --i) { A[1] = A[i] + A[1] - (A[i] = A[1]); adjustDown(A, 1, i - 1); }}int main(void){ std::cout << "--------堆排--------" << std::endl; // A[0]不存储数据,初始化为0 int A1[] = {0, 6, 2, 11, 7, 4, 8}; // A[0]不计算在内,故减1 int len1 = sizeof(A1) / sizeof(int) - 1; // 对数组中前5个数排序 heapsort(A1, len1); for(int i = 1; i <= len1; ++i) std::cout << A1[i] << '\t'; std::cout << '\n' << std::endl; std::cout << "------在堆尾插入一个元素------" << std::endl; int A2[] = {0, 6, 2, 11, 7, 4, 8}; int len2 = sizeof(A2) / sizeof(int) - 1; buildMaxHeap(A2, len2-1); // 打印大顶堆 std::cout << "插入前的大顶堆: " << std::endl; for(int i = 1; i < len2; ++i) std::cout << A2[i] << "\t"; std::cout << std::endl; //插入第len2个元素 adjustup(A2, len2); //打印调整好的大顶堆 std::cout << "插入后的大顶堆" << std::endl; for(int i = 1; i <= len2; ++i) std::cout << A2[i] << '\t'; std::cout << '\n' << std::endl; std::cout << "-----------删除堆顶最大元素-----------" << std::endl; int A3[] = {0, 6, 2, 11, 7, 4, 8}; int len3 = sizeof(A3) / sizeof(int) - 1; buildMaxHeap(A3, len3); std::cout << "删除前的大顶堆: " << std::endl; for(int i = 1; i <= len3; ++i) std::cout << A3[i] << "\t"; std::cout << std::endl; //把堆顶元素和最后一个元素交换,逻辑删除 A3[1] = A3[len3] + A3[1] - (A3[len3] = A3[1]); adjustDown(A3, 1, len3 - 1); std::cout << "删除后的大顶堆: " << std::endl; for(int i = 1; i < len3; ++i) std::cout << A3[i] << "\t"; std::cout << std::endl; return 0;}
结果
0 0
- 我的排序算法
- 我常用的排序
- 我的快速排序
- 我的选择排序
- 我的快速排序
- 我眼中的排序
- 我的排序
- 快速排序之我的快速排序
- 我写的选择排序
- 我写的插入排序
- 我写的冒泡排序
- 我写的快速排序
- 我的Java冒泡排序
- 我写的选择排序
- 我的排序算法小结
- 我的类选择排序
- 冒泡排序我的见解
- 我眼中的插入排序
- “黑马程序员”Java 基础之函数
- 剑指Offer之 - 斐波那契数列
- 静态类成员
- Best Time to Buy and Sell Stock IV Leetcode Java
- 深入理解ThreadLocal
- 我的排序
- java匿名对象
- UVa 1347 - Tour(DP)
- “黑马程序员”java面向对象基础_内部类
- atitit..国富论 在现代it企业项目管理中的作用attialx 总结---国富论读后感 attialx
- ubuntu14.04下安装php5 + mysql + pdo
- 剑指Offer之 - 二进制中1的个数
- 《装饰装修环境标志技术标准》
- Android中Afinal框架简介