冒泡法排序算法的研究-基於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);
}

運行效果如下:

另外:紙上的東西,真正的要輸入到計算機,實際運行一下,才能掌握其原理,才能收穫更多。

紙上得來終覺淺。

任何事情,都是如此,則簡單的事情認真做,可以成爲專家。

 

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