冒泡法排序算法的研究-基于VS2019

做软件开发,需要了解或是掌握一些常用的算法,排序,也是一种算法。

之前嵌入式软件接触的算法不多,但随着科技的进步,常用的通信与控制,相对变的简单化了。除了掌握底层驱动,上层的数据结构与算法,面向对象的编程思路,都是需要不断的掌握起来的,也就是说,要具有与时俱进的心态,有终身学习的打算。

最近手写了冒泡法排序的算法,虽然思路是有的,发现了很多的低级的问题。

(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);
}

运行效果如下:

另外:纸上的东西,真正的要输入到计算机,实际运行一下,才能掌握其原理,才能收获更多。

纸上得来终觉浅。

任何事情,都是如此,则简单的事情认真做,可以成为专家。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章