做軟件開發,需要了解或是掌握一些常用的算法,排序,也是一種算法。
之前嵌入式軟件接觸的算法不多,但隨着科技的進步,常用的通信與控制,相對變的簡單化了。除了掌握底層驅動,上層的數據結構與算法,面向對象的編程思路,都是需要不斷的掌握起來的,也就是說,要具有與時俱進的心態,有終身學習的打算。
最近手寫了冒泡法排序的算法,雖然思路是有的,發現了很多的低級的問題。
(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);
}
運行效果如下:
另外:紙上的東西,真正的要輸入到計算機,實際運行一下,才能掌握其原理,才能收穫更多。
紙上得來終覺淺。
任何事情,都是如此,則簡單的事情認真做,可以成爲專家。