Arduino之堆排序法

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino之堆排序法相关的知识,希望对你有一定的参考价值。

Arduino之堆排序法

采用Arduino IDE编译环境
采用Arduino nano开发板
byte a1=244;
byte e = 211;
int b = 200;
float c = 198.7;
static int array[] = {27, 36, 38, 44, 2, 3, 4, 5, 15, 19, 16, 46, 47, 48, 52};
 int size = sizeof(array) / sizeof(int); //计算数组中的成员数
  
void setup() {
//  int max,cout;

  Serial.begin(115200);
//if ((int)b > (int)c){ Serial.println(b);}
//if(a1 < e){Serial.println(e);}
//max = a1 > e ? e : a1;Serial.println(max);
//cout = (b++,b--,160+b);Serial.println(cout);
//if(10&&5){Serial.println(5,DEC);}Serial.println(10,DEC);

  // 打印数据
  //Serial.println(size);
    Serial.print("排序前数组:");
   display(array, size);
  
}

void loop() {
HeapSort(array, size);
 display(array, size);
  delay(8000);

}

void Down(int array[], int i, int n)
{                        // 最后结果就是大顶堆
  int parent = i;        // 父节点下标
  int child = 2 * i + 1; // 子节点下标
  while (child < n)
  {
    if (child + 1 < n && array[child] < array[child + 1])
    { // 判断子节点那个大,大的与父节点比较
      child++;
    }
    if (array[parent] < array[child])
    {                             // 判断父节点是否小于子节点
      swap(array, parent, child); // 交换父节点和子节点
      parent = child;             // 子节点下标 赋给 父节点下标
    }
    child = child * 2 + 1; // 换行,比较下面的父节点和子节点
  }
}

void BuildHeap(int array[], int size)
{
  for (int i = size / 2 - 1; i >= 0; i--)
  {                       // 倒数第二排开始, 创建大顶堆,必须从下往上比较
    Down(array, i, size); // 否则有的不符合大顶堆定义
  }
}

void HeapSort(int array[], int size)
{
  Serial.print("初始化数组:");
  BuildHeap(array, size); // 初始化堆
  display(array, size);   // 查看初始化结果
  for (int i = size - 1; i > 0; i--)
  {
    swap(array, 0, i); // 交换顶点和第 i 个数据
                       // 因为只有array[0]改变,其它都符合大顶堆的定义,所以可以从上往下重新建立
    Down(array, 0, i); // 重新建立大顶堆

    Serial.print("排序后的数组:");
    display(array, size);
  }
}
void display(int array[], int size)
{
  for (int i = 0; i < size; i++)
  {
     Serial.print(array[i]+String("-"));
  }
  Serial.println("");
}

void swap(int array[], int x, int y)
{
  int key = array[x];
  array[x] = array[y];
  array[y] = key;
}

串口输出结果:

在这里插入图片描述

以上是关于Arduino之堆排序法的主要内容,如果未能解决你的问题,请参考以下文章

重温基础算法内部排序之堆排序法

[2] 算法之路 - 选择之堆排序

算法排序之堆排序

Arduino之插入排序法

Arduino之冒泡排序法

Arduino之插入排序法二