排序算法一——冒泡排序
来源:互联网 发布:涌泉知恩 编辑:程序博客网 时间:2024/05/21 19:41
排序算法一:冒泡排序
最简单,最常用的排序方法之一。冒泡排序是稳定的,相同的值的相对位置在排序后没有改变。时间复杂度O(n^2)。
冒泡排序的代码及其改进版:
/***************************************************** File name:1bubble.c Author: Tang Zhiqian Date:2017-08-07 17:07*****************************************************/#include <stdio.h>#define MAX 10typedef int ElemenType;typedef ElemenType ARR[MAX]; //给数组另起名字int len = sizeof(ARR)/sizeof(ElemenType); //数组长度void swap(ElemenType arr[],int i,int j); //交换函数void print(ARR arr); //打印void bubble1(ARR arr); //未改进的冒泡排序void bubble2(ARR arr); //改进后的冒泡排序int main(){ ARR arr1 = {9,0,1,2,3,4,5,6,7,8}; ARR arr2 = {9,0,1,2,3,4,5,6,7,8}; printf("\n未改进的冒泡排序:\n"); bubble1(arr1); printf("\n"); printf("改进后的冒泡排序:\n"); bubble2(arr2); return 0;}void bubble1(ARR arr){ int i,j; for (i = 0; i < len - 1; i++) { for (j = 0; j < len - i - 1; j++) { if (arr[j] > arr[j + 1]) { swap(arr,j,j+1); } } print(arr); }}void bubble2(ARR arr){ int i,j; int flag = 1; for (i = 0; i < len - 1; i++) { flag = 0; for (j = 0; j < len - i - 1; j++) { if (arr[j] > arr[j + 1]) { flag = 1; //进入这个判断,flag = 1; swap(arr,j,j+1); } } if (flag == 0) //如果flag等于零,说明上一次循环没有交换位置,说明排序已经完成,则break { break; } print(arr); }}void print(ARR arr){ int i; for (i = 0; i < len; i++) { printf("%d ",arr[i]); } printf("\n");}void swap(ElemenType arr[],int i,int j){ ElemenType temp; temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;}
程序运行结果:
在这里我们看到,未改进的bubble1排序,输出了9行排好序的数,而改进过的bubble2只输出了一行。未排序前的数字顺序为{9,0,1,2,3,4,5,6,7,8},观察发现,其实经过一轮冒泡之后,这个数组就已经排好序了,但是程序不知道是否排好序,所以会一直循环完。 但是在bubble2中我添加了一个flag,进入第一个for循环就让flag=0,第二级for循环中if判断下flag= 1,假设二级for循环一圈后都没有进入到if里面,则flag = 0,说明这时候数组已经排好序了,因为它一轮比较之后都没有进入if里面执行swap函数。这样下来电脑就少执行了很多次 比较 的过程。
阅读全文
1 0
- 排序算法一——冒泡排序
- 排序算法—冒泡排序
- C#排序算法(一)——冒泡排序
- 基础排序算法(一)——冒泡排序
- 排序算法(一)——冒泡排序及改进
- 排序算法自我练习(一)——冒泡排序
- 排序算法之——冒泡排序(一)
- (一)算法——冒泡排序、选择排序
- 排序算法(一)——冒泡排序及改进
- 排序算法(一)——冒泡排序及改进
- 排序算法《一》冒泡排序
- 排序算法一 冒泡排序
- 排序算法一:冒泡排序
- 排序算法一:冒泡排序
- 排序算法一:冒泡排序
- 排序算法(一):冒泡排序
- 排序算法(一)-冒泡排序
- 【排序算法】——冒泡排序算法
- 基于erlang语言的socket通信
- RxJava 2.x.x Observable 与 Observer 入门分析
- Mycat读写分离与注意事项
- Oauth详解
- java多线程获取结果 Callable和Future
- 排序算法一——冒泡排序
- zoj3710 friends(floyd变形)
- XML
- 套路数学——扫雷
- 浅谈JVM内存模型
- FTP学习2_FTP命令之删除多个文件/删除整个文件夹
- ImportError: No module named win32api解决
- CSRF攻击及预防
- Mysql的优化