冒泡排序,选择排序,插入排序
2016-12-27 13:15
267 查看
冒泡排序:
冒泡排序基本思想:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
时间复杂度:如果是按照优化后的算法来看,最优的就是已经有序,没有数据交换只有比较,时间复杂度是O(n).当最坏的情况,就是待排序表是逆序的情况,此时需要比较1+2+3+...+(n+1) = n(n-1) /2 次,并坐等数量级的记录移动,总的时间复杂度为O(n^2).
实现代码:
针对冒泡算法优化:
在二级for循环中增加bool值记录是否当前循环有移动数据,如果没有代表是已经有序的,不需要再浪费资源去遍历循环,停止。
[b]选择排序[/b]
简单选择排序就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换。
时间复杂度:O(n^2),但是仍然优于冒泡排序。最大特点就是减少了交换移动数据次数相当少。
实现代码:
直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增1的有序表。
时间复杂度:O(n^2),但是还要逼选择排序性能要好一些。
实现代码:
根据排序过程中借助的主要操作,我们将内排序分为:插入排序,交换排序,选择排序和归并排序四类。
下图是7种算法的各种指标进行对比:
从算法的简单性来看,将7种算法分类:
简单算法:冒泡,简单选择,直接插入。
改进算法:希尔,堆,归并,快速。
冒泡排序基本思想:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
时间复杂度:如果是按照优化后的算法来看,最优的就是已经有序,没有数据交换只有比较,时间复杂度是O(n).当最坏的情况,就是待排序表是逆序的情况,此时需要比较1+2+3+...+(n+1) = n(n-1) /2 次,并坐等数量级的记录移动,总的时间复杂度为O(n^2).
实现代码:
int a[10] = {5,9,3,4,1,7,8,6,10,2}; int temp; for (int i = 0; i <= 9; i++) { for (int j = 9 ; j > i ; j--) { if (a[j-1]<a[j]) { temp = a[j]; a[j] = a[j-1]; a[j-1] = temp; } } }
针对冒泡算法优化:
在二级for循环中增加bool值记录是否当前循环有移动数据,如果没有代表是已经有序的,不需要再浪费资源去遍历循环,停止。
[b]选择排序[/b]
简单选择排序就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换。
时间复杂度:O(n^2),但是仍然优于冒泡排序。最大特点就是减少了交换移动数据次数相当少。
实现代码:
int a[10] = {5,9,3,4,1,7,8,6,10,2}; int min,temp; for (int i = 0; i<9; i++) { min = i; for (int j = i+1; j<= 9; j++) { if (a[min] < a[j]) { min = j; } } if (min!=i) { temp = a[min]; a[min] = a[i]; a[i] = temp; } }插入排序:
直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增1的有序表。
时间复杂度:O(n^2),但是还要逼选择排序性能要好一些。
实现代码:
int a[10] = {5,9,3,4,1,7,8,6,10,2}; int i,j; for (i = 2; i<=9; i++) { if (a[i] < a[i-1]) { a[0] = a[i]; for (j =i - 1; a[j] > a[0]; j--) { a[j+1] = a[j]; } a[j+1] = a[0]; } }
根据排序过程中借助的主要操作,我们将内排序分为:插入排序,交换排序,选择排序和归并排序四类。
下图是7种算法的各种指标进行对比:
从算法的简单性来看,将7种算法分类:
简单算法:冒泡,简单选择,直接插入。
改进算法:希尔,堆,归并,快速。
相关文章推荐
- 快速排序、插入排序、选择、冒泡
- 【算法基础】冒泡、选择、插入排序(三种基本排序)
- 【排序】时间复杂度为O(N^2)的排序——冒泡、选择和插入排序
- 冒泡排序 选择排序 插入排序
- 冒泡排序、交换排序、选择排序、插入排序、快速排序、SHELL排序
- 三种基础排序(冒泡、选择、插入排序)
- 冒泡、选择、快速排序、插入排序
- 经典排序之选择、冒泡、插入排序与系统排序的用时比较(Java)
- c++排序part1: 冒泡、选择、插入排序
- 简单排序(冒泡,选择排序,插入排序)
- Java 常用排序算法实现--快速排序、插入排序、选择、冒泡
- 冒泡排序、选择排序、插入排序 算法实现(C++)
- 数组的排序(选择/冒泡/插入排序)
- 冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序六大排序大总结
- Java 常用排序算法实现--快速排序、插入排序、选择、冒泡
- 第四篇、C_快速、冒泡、选择、插入排序、二分查找排序、归并、堆排序
- java类实现数组的五种排序 冒泡排序、选择排序、插入排序、希尔排序、数组排序
- 冒泡,插入,折半插入,希尔,快速,简单选择排序源码总结
- JAVA冒泡与选择排序,折半查找
- Python实现冒泡排序、选择排序、插入排序、快速排序、归并排序、二分法查找算法(基于《算法导论》伪代码)