开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情
对于程序员来说,排序算法开发基本不会用到,但是咱们需要会,也要会手撸简单的算法。
一般用到的数据量也不会太大,基本都是内排序,那就是全部数据再内存中处理,进行排序。
冒泡算法是一种比较简单的算法。基本思想就是大数值上浮,小数值下沉。
基本过程:通过比较相邻的两个数值,如果第二个数值小,则交换位置;
继续和下个数值比较,循环n-1次,最大的数值就排序完成;
从头比较n-2次,排序第二大的数值;
循环这个过程,就可以完成排序任务了;\
因为算法思想是一趟趟的比较,基本上时间复杂度都是O(n2),最差时间复杂度O(n2),最好的情况下时间复杂度是O(n),优化算法可以提高时间复杂度。
代码实现(C):
#include<stdio.h>
#include <stdlib.h>
#include<unistd.h>
#include <string.h>
#include <errno.h>
int Cnt = 0;
int NumArr[200] = {0};
void PrintNums()
{
for(int i = 0;i < Cnt;i++){
fprintf(stdout," %d-",NumArr[i]);
}
}
int main(int argc, char** argv)
{
if(argc == 1) {
fprintf(stderr,"%s:need a some arg\n",argv[0]);
exit(1);
}
int CntTemp = Cnt = argc -1;
for(int i = 0;i < Cnt;i++){
NumArr[i] = atoi(argv[i+1]);
}
fprintf(stdout,"inputNum:");
PrintNums();
fprintf(stdout,"\n");
int temp = 0;
while(--CntTemp){
for(int a = 0;a < CntTemp;a++){
if(NumArr[a] > NumArr[a+1]) {
temp = NumArr[a];
NumArr[a] = NumArr[a+1];
NumArr[a+1] = temp;
}
}
}
fprintf(stdout,"result:");
PrintNums();
fprintf(stdout,"\n");
return 0;
}
makefile写法:
Tgt:=Test.out
Obj :=TestMain.o
$(Tgt):$(Obj)
gcc -o $@ $^
clean:
rm -f *.o
因为相邻数值相等时,并不会做交换,所以算法是稳定的。
代码中时间复杂度固定是O(n2)。
优化途径,可以在比较的时候增加一个状态,如果在比较的过程中,没有发生交换,则说明排序完成,在最好的情况下可以实现时间复杂度为O(n)。
通过终端输入一些数值,代码固定写了200个正整数类型的数组,作为参数输入比较的数值,代码逻辑里浮点数可以用来排序。 编译和执行如下图所示: