黑马程序员——C语言基础——冒泡排序算法探究

来源:互联网 发布:windows上的qt库吗 编辑:程序博客网 时间:2024/05/19 15:24

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

在整理前几天的C语言学习笔记的时候,看到了这个冒泡排序算法的问题 。

在复习这块内容试着编写一个函数时,我遇到了一些问题。让我们来看看我是怎么解决他们的。

1.首先来看一段标准的冒泡排序算法的代码:

#include <stdio.h>void sort(int *a,int len){ int t;    for(int i = 0; i < len; i++){        for(int j = 0; j < len - i - 1; j++){            if(a[j] > a[j + 1]){                t = a[j];                a[j] = a[j + 1];                a[j + 1] = t;            }        }    }}
运行后的有效步数为13次,此标准方法将相邻的数值两两交换,直到最后排序完成。

2.再来看看作为C语言初学者所编写的冒泡排序算法

void showArray(int *array, int len){    for (int i = 0, max = len; i < max; i++) {        printf("%d\t", array[i]);    }}int main(int argc, const char * argv[]) {    //定义数组    int array[] = {23, 56, 17, 24, 89, 10, 16, 57, 88, 84};    int t = 0;    //循环数组,每次取出一个值进行循环    for (int i = 0, max = 10; i < max; i++) {        for (int j = 0, max = 10; j < max; j++) {            if( array[i] < array[j]){                t = array[j];                array[j] = array[i];                array[i] = t;                showArray(array, 10);                printf("\n");            }        }    }        for (int i = 0, max = sizeof(array) / sizeof(array[0]); i < max; i++) {        printf("%d\t", array[i]);    }}
上面提到比较标准的冒泡排序算法大概用了17步处理,来完成排序。

而这段方法则执行了22步处理,效率几乎下降了30%!是什么原因造成了这个现象?

通过分析发现第一种方法只在排序中,完成了那些必要的数值交换操作。

而第二种方法的数值交换记录如下:

56231724891016578884892317245610165788842389172456101657888417892324561016578884172389245610165788841723248956101657888417232456891016578884102324568917165788841017245689231657888410172356892416578884101723248956165788841017232456891657888410162324568917578884101617245689235788841016172356892457888410161723248956578884101617232456895788841016172324565789888410161723245657888984101617232456578489881016172324565784888910161723245657848889
通过记录可以发现由于初始数据的顺序中,有个别较大数字位于数组前几项。

而这种算法由于每次都会与自身比较、与数值交换后的数组项进行比较。

由此导致了算法的冗余。并且这种冗余还会随着数据随机性而不断加大。


可见,算法的重要性无处不在。一个完善的算法不仅会使代码量减少,代码逻辑清晰。

更可能会减小内存消耗,提升运行速度。甚至会改善我们APP的用户体验。




0 0
原创粉丝点击