zoukankan      html  css  js  c++  java
  • 好理解的堆排序

    对于堆排序,其实就是一个路径上的冒泡的过程,所以可以用这个思想去写代码,

    思路:每次父节点都和他的左子树和右子树比较,三者中最大的那个与父节点交换位置,这样递归之后根节点存放的就是该次遍历最大的值,之后将根节点与最后的节点交换,在进行查找(0~(lenth-1))中的最大值与倒数第二个交换位置就OK了。这样自己比较好理解。

     1 #include <iostream>
     2 using namespace std;
     3 
     4 void swap(int &a, int &b){
     5     int tmp = a;
     6     a = b;
     7     b = tmp;
     8 }
     9 
    10 int findmax(int a[],int lenth,int i){
    11     //找到第i个节点所代表的子树中的最大值
    12     if(2*(i) >= lenth) return a[i];
    13     int left, right,max;
    14     int rightmax,leftmax;
    15     rightmax = leftmax = max =0;
    16     right = 2*i+1;
    17     left = 2*i;
    18     if(i == 0){
    19         right = 2;
    20         left = 1;
    21     }
    22     leftmax = findmax(a,lenth,left);
    23     if(right < lenth){
    24         rightmax = findmax(a,lenth,right);
    25     }
    26     if(leftmax > rightmax && leftmax > a[i])swap(a[i],a[left]);
    27     if(rightmax > leftmax && rightmax > a[i])swap(a[i],a[right]);
    28     return a[i];
    29 }
    30 
    31 int* heapSort(int a[], int lenth){     
    32     int max;
    33     for(int i = 0; i < lenth; i++){
    34         max = findmax(a, lenth-i, 0);
    35         swap(a[0], a[lenth-i-1]);
    36     }
    37     return a;
    38 }
    艰难的成长
  • 相关阅读:
    [ 字典树题目 ]
    AC Challenge [ ACM-ICPC 2018 南京赛区网络预赛 ] [dfs + 二进制记忆化搜索 ]
    ACM-ICPC 2018 南京赛区网络预赛 J.Sum [ 类打表 ]
    Bzoj 3224.普通平衡树 [ 权值线段树 ]
    IP:网际协议
    网络概述
    HashSet
    idea中git各颜色文件含义
    keytool证书管理
    openssl证书管理
  • 原文地址:https://www.cnblogs.com/marylins/p/3588728.html
Copyright © 2011-2022 走看看