经典排序算法学习笔记一——冒泡排序
2016-10-03 23:13
375 查看
冒泡排序
数据结构 | 数组 |
---|---|
最差时间复杂度 | O(n^2) |
最优时间复杂度 | O(n) |
平均时间复杂度 | O(n^2) |
最差空间复杂度 | 总共O(n),需要辅助空间O(1) |
1、算法思想
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
2、伪代码
function bubble_sort (array, length) { var i, j; for(i from 0 to length-1){ for(j from 0 to length-1-i){ if (array[j] > array[j+1]) swap(array[j], array[j+1]) } } }
3、实现
#include <stdio.h> void bubble_sort(int arr[], int len) { int i, j, temp; for (i = 0; i < len - 1; i++) for (j = 0; j < len - 1 - i; j++) if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } int main() { int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 }; int len = (int) sizeof(arr) / sizeof(*arr); bubble_sort(arr, len); int i; for (i = 0; i < len; i++) printf("%d ", arr[i]); return 0; }
4、改进
(1)设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。伪代码:参考 http://visualgo.net/sorting
do swapped = false for i = 1 to indexOfLastUnsortedElement if leftElement > rightElement swap(leftElement, rightElement) swapped = true while swapped
实现:参考 http://www.cnblogs.com/morewindows/archive/2011/08/06/2129603.html
void BubbleSort2(int a[], int n) { int j, k; bool flag; k = n; flag = true; while (flag) { flag = false; for (j = 1; j < k; j++) if (a[j - 1] > a[j]) { Swap(a[j - 1], a[j]); flag = true; } k--; } }
(2)如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。
参考:白话经典算法系列之一 冒泡排序的三种实现
http://www.cnblogs.com/morewindows/archive/2011/08/06/2129603.html
实现:
void BubbleSort3(int a[], int n) { int j, k; int flag; flag = n; while (flag > 0) { k = flag; flag = 0; for (j = 1; j < k; j++) if (a[j - 1] > a[j]) { Swap(a[j - 1], a[j]); flag = j; } } }
相关文章推荐
- 深层次两张图解经典6大排序与6大基础数据结构——学完这些,妈妈再也不用担心我的排序算法与数据结构,学习笔记大放送
- 经典排序算法学习笔记
- 经典排序算法学习笔记六——归并排序
- 经典排序算法学习笔记五——直接选择排序
- 经典排序算法学习笔记二——快速排序
- 经典排序算法学习笔记七——堆排序
- 黑马程序员_java基础学习笔记之排序算法(选择排序、冒泡排序
- 经典排序算法学习笔记四——希尔排序
- SQL Server 2005 学习笔记系列文章导航 存储过程分页的经典例子
- 学习笔记---递归的代码,解决经典的汉诺塔问题
- C#学习笔记—数组的冒泡排序
- java排序算法学习(一)--冒泡排序
- Entity Bean(经典学习笔记之一)
- c#经典入门--学习笔记
- C#实现所有经典排序算法(选择排序,冒泡排序,快速排序,插入排序,希尔排序)
- mini-web学习笔记之经典CRUD显示页面总结
- 入门帖: Lotus 学习笔记(新手必进,经典资料)
- c#经典入门学习笔记-封箱和拆箱
- 操作系统学习笔记(10) 互斥和同步的经典问题
- Cisco路由器OSPF协议经典学习笔记