黑马程序员——C语言基础——冒泡排序算法探究
2015-06-01 16:30
351 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
在整理前几天的C语言学习笔记的时候,看到了这个冒泡排序算法的问题 。
在复习这块内容试着编写一个函数时,我遇到了一些问题。让我们来看看我是怎么解决他们的。
1.首先来看一段标准的冒泡排序算法的代码:
2.再来看看作为C语言初学者所编写的冒泡排序算法
而这段方法则执行了22步处理,效率几乎下降了30%!是什么原因造成了这个现象?
通过分析发现第一种方法只在排序中,完成了那些必要的数值交换操作。
而第二种方法的数值交换记录如下:
而这种算法由于每次都会与自身比较、与数值交换后的数组项进行比较。
由此导致了算法的冗余。并且这种冗余还会随着数据随机性而不断加大。
可见,算法的重要性无处不在。一个完善的算法不仅会使代码量减少,代码逻辑清晰。
更可能会减小内存消耗,提升运行速度。甚至会改善我们APP的用户体验。
在整理前几天的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%!是什么原因造成了这个现象?
通过分析发现第一种方法只在排序中,完成了那些必要的数值交换操作。
而第二种方法的数值交换记录如下:
56 23 17 24 89 10 16 57 88 84 89 23 17 24 56 10 16 57 88 84 23 89 17 24 56 10 16 57 88 84 17 89 23 24 56 10 16 57 88 84 17 23 89 24 56 10 16 57 88 84 17 23 24 89 56 10 16 57 88 84 17 23 24 56 89 10 16 57 88 84 10 23 24 56 89 17 16 57 88 84 10 17 24 56 89 23 16 57 88 84 10 17 23 56 89 24 16 57 88 84 10 17 23 24 89 56 16 57 88 84 10 17 23 24 56 89 16 57 88 84 10 16 23 24 56 89 17 57 88 84 10 16 17 24 56 89 23 57 88 84 10 16 17 23 56 89 24 57 88 84 10 16 17 23 24 89 56 57 88 84 10 16 17 23 24 56 89 57 88 84 10 16 17 23 24 56 57 89 88 84 10 16 17 23 24 56 57 88 89 84 10 16 17 23 24 56 57 84 89 88 10 16 17 23 24 56 57 84 88 89 10 16 17 23 24 56 57 84 88 89通过记录可以发现由于初始数据的顺序中,有个别较大数字位于数组前几项。
而这种算法由于每次都会与自身比较、与数值交换后的数组项进行比较。
由此导致了算法的冗余。并且这种冗余还会随着数据随机性而不断加大。
可见,算法的重要性无处不在。一个完善的算法不仅会使代码量减少,代码逻辑清晰。
更可能会减小内存消耗,提升运行速度。甚至会改善我们APP的用户体验。
相关文章推荐
- C++拷贝构造函数
- Windows下,Netbeans使用C++的配置方法
- C语言笔记(三)
- VC++例说Windows窗口、视口以及GDI映射模式
- 嵌入式C语言高级_内存空间 笔记
- 钢条切割问题的解法(C/C++)
- C++作用域、内存分区的汇总
- C++ delete错误
- C++之STL简介
- C语言中的强符号与弱符号(关于变量声明与定义的深入讨论)
- C语言-----CGI程序
- C++引用作为函数的参数
- C语言 链表基本函数
- C/C++ void func() const
- C山寨C++
- C++对象拾遗
- C++ 9.2迭代器支持的运算和迭代器范围
- c++MFC编译错误
- Ogre SdkTrays UI c++ code override with c# (.net2.0)
- C语言点滴