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之堆排序法的主要内容,如果未能解决你的问题,请参考以下文章