做软件开发,需要了解或是掌握一些常用的算法,排序,也是一种算法。
之前嵌入式软件接触的算法不多,但随着科技的进步,常用的通信与控制,相对变的简单化了。除了掌握底层驱动,上层的数据结构与算法,面向对象的编程思路,都是需要不断的掌握起来的,也就是说,要具有与时俱进的心态,有终身学习的打算。
最近手写了冒泡法排序的算法,虽然思路是有的,发现了很多的低级的问题。
(1)计算机编程,习惯了使用IDE,使用变量或是函数名自动补全,代码的编写除了通过搜索获取代码,改下格式与程序结构,很少从头到尾的写。
(2)一般代码,很少一次性写对,变量名称,函数名称,数据类型,程序逻辑,测试代码,可能是不断的调试与修改。
手写的代码,没有上机验证,无法直接获取输出结果。需要通过理解,大体上判断逻辑上是否清晰,逻辑是否有误。所以,基本功还是要打一打。我对自己手写的代码,写完发现逻辑不正确,修改后,勉强能工作,并且还没有考虑异常情况。
当然,这些不足,都是自己平时不太注重细节造成的,虽说世界在剧烈的变化,心态还是要稳,一步步把框架搭好,把细节处理好,这就是人生的高楼的建设过程。
冒泡排序的主要算法,需要考虑:
(1)排序的是什么数值,有符号还是无符号,一般用int型数组(有符号)足够了。
(2)使用VS2019,发现直接在数组里初始化一个负数,会被自动转换成一个正数,因此,负数使用括号括起来,-3使用(-3)。
(3)排序,有两种方式,从小到大的排序,从大到小的排序。
(4)两个循环,最外层的需要整个数组遍历,内层的,不用全部遍历,因为每次循环,已经把最小的或是最大的,推到了尾部。
(5)实际了,这种排序,不需要额外的输出数组,直接在原数组上也可以工作,只是,破坏了原来的输入数组。
(6)如果是int型的数组,不要直接memcpy(字节复制)。
可能还有其他的注意事项
一种实现如下:
// bubble_sort_t0.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#define MAX_BUF_NUM 20 //最大数组的个数
void bubble_sort_high(int32_t * input_buf, uint32_t input_len, int32_t * output_buf)
{
uint32_t i, j;
int32_t swap_val = 0;
for (i = 0; i < input_len; i++) //只为了不影响输入的数组
{
output_buf[i] = input_buf[i];
}
for (i = 0; i < input_len; i++) //外循环,整个数组遍历
{
/* (1)相邻两个数据比较,把小的往后推,这样尾端的数值是最小的。
(2)尾端不再重复参与比较。*/
for (j = 0; j < input_len - i - 1; j++)
{
if (output_buf[j] < output_buf[j + 1])
{
swap_val = output_buf[j];
output_buf[j] = output_buf[j + 1];
output_buf[j + 1] = swap_val;
}
}
}
}
void bubble_sort_low(int32_t* input_buf, uint32_t input_len, int32_t* output_buf)
{
uint32_t i, j;
int32_t swap_val = 0;
for (i = 0; i < input_len; i++) //只为了不影响输入的数组
{
output_buf[i] = input_buf[i];
}
for (i = 0; i < input_len; i++) //外循环,整个数组遍历
{
/* (1)相邻两个数据比较,把大的往后推,这样尾端的数值是最大的。
(2)尾端不再重复参与比较。*/
for (j = 0; j < input_len - i - 1; j++)
{
if (output_buf[j] > output_buf[j + 1])
{
swap_val = output_buf[j];
output_buf[j] = output_buf[j + 1];
output_buf[j + 1] = swap_val;
}
}
}
}
void print_buf(int32_t * buf, uint32_t buf_len) //打印buffer
{
uint32_t i = 0;
printf("\n---------------\n");
for (i = 0; i < buf_len; i++)
{
printf(" %d", buf[i]);
}
printf("\n---------------\n");
}
int main()
{
int32_t input_buf[MAX_BUF_NUM] = { 1,3,33,5,79,66,88,22,(-3),102,105,(-5),(-8),(-33),(-112),(-9),(-11),(-42),333,234};
int32_t output_buf[MAX_BUF_NUM] = { 0 };
printf("\n------sort high to low ---------\n");
bubble_sort_high(input_buf, MAX_BUF_NUM, output_buf); //高到低排序
print_buf(output_buf, MAX_BUF_NUM);
printf("\n------sort low to high ---------\n");
bubble_sort_low(input_buf, MAX_BUF_NUM, output_buf); //低到高排序
print_buf(output_buf, MAX_BUF_NUM);
}
运行效果如下:
另外:纸上的东西,真正的要输入到计算机,实际运行一下,才能掌握其原理,才能收获更多。
纸上得来终觉浅。
任何事情,都是如此,则简单的事情认真做,可以成为专家。