十大算法之冒泡算法

88 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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个正整数类型的数组,作为参数输入比较的数值,代码逻辑里浮点数可以用来排序。 编译和执行如下图所示:

image.png