排序基础之插入排序、冒泡排序、选择排序详解与Java代码实现
2017-03-21 15:23
851 查看
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6594533.html
一:插入排序==逐个往前相邻数比较交换,小的在前
第一轮:A[1]与A[0]比较,小的在前面;
第二轮:A[2]~A[0]相邻数比较,小的交换到前面,直到合适位置;
...
第n-1轮:A[n-1]往前比较,小则交换到前面,继续比较交换直到合适位置。
复杂度计算:T=1+2+...(n-1)=(n-1)(n-2)/2=O(n^2)
二:冒泡排序==相邻数比较交换,大者放在后面,每一次把当前轮最大者交换到末尾
排序开始:从0到n-1,进行相邻数比较交换操作,大者放在后面。
第二轮:从0到n-1,进行相邻数比较交换操作,大者放在后面。
......
第n-1轮:比较a[0]和a[1],大者放后面。此时整个数组有序。
复杂度计算:T=n+(n-1)+...+1=n(n-1)/2=O(n^2)
三:选择排序==每次选择待排序列最小者交换到待排序列的最前方
排序开始:从0到n-1遍历,选出最小者,交换到0位置;
第二轮:从1到n-1遍历,选择出最小者,交换到1位置;
...
第n-1轮:从n-2到n-1之间,选择最小者,放到n-2处。此时,0~n-1有序。
复杂度计算:T=n+(n-1)+...+1=n(n-1)/2=O(n^2)
(总结:三个O(n^2)的排序算法,插入、冒泡都是相邻元素比较交换达到合适位置的,选择则每次选出最小者交换到开头)
一:插入排序==逐个往前相邻数比较交换,小的在前
第一轮:A[1]与A[0]比较,小的在前面;
第二轮:A[2]~A[0]相邻数比较,小的交换到前面,直到合适位置;
...
第n-1轮:A[n-1]往前比较,小则交换到前面,继续比较交换直到合适位置。
复杂度计算:T=1+2+...(n-1)=(n-1)(n-2)/2=O(n^2)
public int[] insertionSort(int[] A, int n) { for(int i=0;i<n-1;++i){//i标记有序序列最后位置 for(int j=i+1;j>0;--j){//j为待插入元素 if(A[j]<A[j-1]){//从j开始不断与自己的前面元素比较交换 int temp; temp=A[j-1]; A[j-1]=A[j]; A[j]=temp; } } } return A; }
二:冒泡排序==相邻数比较交换,大者放在后面,每一次把当前轮最大者交换到末尾
排序开始:从0到n-1,进行相邻数比较交换操作,大者放在后面。
第二轮:从0到n-1,进行相邻数比较交换操作,大者放在后面。
......
第n-1轮:比较a[0]和a[1],大者放后面。此时整个数组有序。
复杂度计算:T=n+(n-1)+...+1=n(n-1)/2=O(n^2)
public class BubbleSort { public int[] bubbleSort(int[] A, int n) { while(n>=1){//n控制当前是第几轮 for(int i=0;i<n-1;++i){//i负责当前轮的比较交换。注意这里是<n-1。而不是<=n-1。因为下面是i与i+1比较,如果遍历到n-1的话i+1就越界了 if(A[i]>A[i+1]){//比较,交换,让相邻两者大的在后面 int temp; temp=A[i]; A[i]=A[i+1]; A[i+1]=temp; } } --n;//当前轮结束,缩小范围 } return A; } }
三:选择排序==每次选择待排序列最小者交换到待排序列的最前方
排序开始:从0到n-1遍历,选出最小者,交换到0位置;
第二轮:从1到n-1遍历,选择出最小者,交换到1位置;
...
第n-1轮:从n-2到n-1之间,选择最小者,放到n-2处。此时,0~n-1有序。
复杂度计算:T=n+(n-1)+...+1=n(n-1)/2=O(n^2)
public int[] selectionSort(int[] A, int n) { for(int i=0;i<=n-1;++i){//当前轮待排序的开始位置 int min=i;//记录待排序列最小值下标 for(int j=i;j<=n-1;++j){ if(A[min]>A[j]){ min=j;//选择最小值下标 } } if(min!=i){//如果待排序列开头不是最小值,则交换 int temp; temp=A[i]; A[i]=A[min]; A[min]=temp; } } return A; }
(总结:三个O(n^2)的排序算法,插入、冒泡都是相邻元素比较交换达到合适位置的,选择则每次选出最小者交换到开头)
相关文章推荐
- java实现各种基础排序(冒泡排序、快速排序、直接选择排序、堆排序、直接插入排序、归并排序)
- [java]排序分类--及选择排序、插入排序、冒泡排序、快速排序的解释图和代码
- 冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序java实现
- 数据结构与算法——三种基础排序算法C#实现(冒泡排序、选择排序、插入排序)
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 黑马程序员——java基础排序算法:选择排序、冒泡排序和插入排序
- 冒泡排序、选择排序、插入排序、快速排序算法的时间性能分析(java实现)
- java实现 冒泡排序 插入排序 选择排序
- 数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现
- java实现数组的冒泡排序、选择排序代码
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- java实现冒泡排序,插入排序,选择排序,快速排序
- 最简单之Java实现冒泡排序、选择排序、插入排序、希尔排序、归并排序和快速排序(转载请注明出处)
- java 实现 冒泡排序、选择排序、插入排序。
- 基础排序——冒泡排序、选择排序、插入排序的讲解、代码实现
- java 实现 冒泡排序、选择排序、插入排序。
- Java实现冒泡排序、快速排序、选择排序、插入排序和归并排序
- Python实现冒泡排序、选择排序、插入排序、快速排序、归并排序、二分法查找算法(基于《算法导论》伪代码)