基本排序_冒泡排序_Java实现
2015-12-17 14:30
465 查看
转载请注明出处:/article/11557473.html
本文出自:【梁敬明的博客】
如上图所示,假设一个序列的初始状态为【9】【8】【7】【6】【5】,将序列由小到大进行排序,每次进行排序时从后往前依次比较两个数的大小,将较小的数前置。
第一次排序,找到最小的数为5,将其排在序列的第1位。
第二次排序,找到最小的数为6,将其排在序列的第2位。
第三次排序,找到最小的数为7,将其排在序列的第3位。
第四次排序,找到最小的数为8,将其排在序列的第4位。
只剩最后一个数,不用再次进行比较,直接位于序列最后。
当进行第i次排序时,需要从N与N-1开始从后往前两两元素进行比较,直到比较到第i位为止。
当元素间进行两两比较时,位置不在发生变换,说明此时序列为有序序列,可以直接结束循环。
若序列的初始状态处于正序,遍历一次,不需要交换元素间的位置,即可完成排序,所以比较次数和移动次数均为最小值。比较次数Cmin=n−1C_{min}=n-1,移动次数Mmin=0M_{min}=0,所以冒泡排序的最好时间复杂度为O(n)O(n)。
若序列的初始状态为倒序,需要进行n-1次排序,每次排序都需要进行n-i次的比较,都需要移动记录三次来交换元素位置,所以比较次数和移动次数均为最大值。比较次数Cmax=n(n−1)2=O(n2)C_{max}=\frac{n(n-1)}{2}=O(n^2),移动次数Mmax=3n(n−1)2=O(n2)M_{max}=\frac{3n(n-1)}{2}=O(n^2),所以冒泡排序的最坏时间复杂度为O(n2)O(n^2)。
因此,冒泡排序总的时间复杂度为O(n2)O(n^2)。
算法稳定性:
冒牌排序是比较相邻的两个元素,交换也发生在两个元素之间,若两个元素相等,不会发生交换,相同元素的顺序不会发生改变。因此,冒泡排序是一种稳定的排序算法。
本文出自:【梁敬明的博客】
1.冒泡排序
冒泡排序就是重复的按照特定的顺序比较两两元素的大小,交换它们,直到最后没有可以交换的元素为止。如上图所示,假设一个序列的初始状态为【9】【8】【7】【6】【5】,将序列由小到大进行排序,每次进行排序时从后往前依次比较两个数的大小,将较小的数前置。
第一次排序,找到最小的数为5,将其排在序列的第1位。
第二次排序,找到最小的数为6,将其排在序列的第2位。
第三次排序,找到最小的数为7,将其排在序列的第3位。
第四次排序,找到最小的数为8,将其排在序列的第4位。
只剩最后一个数,不用再次进行比较,直接位于序列最后。
2.示例代码
假设对一个长度为N的序列由小到大进行排序,第i次排序,需要找到最小的数为m,将其排在序列的第i位,当最终完成排序后需要进行N-1次排序。当进行第i次排序时,需要从N与N-1开始从后往前两两元素进行比较,直到比较到第i位为止。
当元素间进行两两比较时,位置不在发生变换,说明此时序列为有序序列,可以直接结束循环。
public class BubbleSort { public static void main(String[] args) { int[] array = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; BubbleSort.sort(array); System.out.println("排序后数组:" + Arrays.toString(array)); } public static void sort(int[] a) { // 用于标志排序过程中元素是否发生交换 boolean flag = false; for (int i = 0; i < a.length - 1; i++) { // 从后向前遍历依次比较相邻两数大小,将较小的数进行前置 for (int j = a.length - 1; j > i; j--) { if (a[j - 1] > a[j]) { a[j] = a[j - 1] + a[j]; a[j - 1] = a[j] - a[j - 1]; a[j] = a[j] - a[j - 1]; flag = true; } } // 若某一轮没有发生交换,说明是有序数列,直接跳出循环 if (flag == false) break; System.out.println(Arrays.toString(a)); } } }
3.算法分析
时间复杂度:若序列的初始状态处于正序,遍历一次,不需要交换元素间的位置,即可完成排序,所以比较次数和移动次数均为最小值。比较次数Cmin=n−1C_{min}=n-1,移动次数Mmin=0M_{min}=0,所以冒泡排序的最好时间复杂度为O(n)O(n)。
若序列的初始状态为倒序,需要进行n-1次排序,每次排序都需要进行n-i次的比较,都需要移动记录三次来交换元素位置,所以比较次数和移动次数均为最大值。比较次数Cmax=n(n−1)2=O(n2)C_{max}=\frac{n(n-1)}{2}=O(n^2),移动次数Mmax=3n(n−1)2=O(n2)M_{max}=\frac{3n(n-1)}{2}=O(n^2),所以冒泡排序的最坏时间复杂度为O(n2)O(n^2)。
因此,冒泡排序总的时间复杂度为O(n2)O(n^2)。
算法稳定性:
冒牌排序是比较相邻的两个元素,交换也发生在两个元素之间,若两个元素相等,不会发生交换,相同元素的顺序不会发生改变。因此,冒泡排序是一种稳定的排序算法。
相关文章推荐
- java统计字符串中指定元素出现次数方法
- spring问题排查-调低日志等级
- struts学习笔记(四)
- java资料——线程(转)
- Java将数据库数据导入EXCEL
- Maven Missing artifact jdk.tools:jdk.tools:jar:1.7 解决办法
- springMVC对于controller处理方法返回值的可选类型
- Java 反射
- Java算法---坐标移动
- java中数据持久层查询操作
- JAVA面向对象的思想
- Java之多线程内存可见性_2(volatile不能保证原子性)
- Spring mvc+hibernate+freemarker(实战)
- Java关键字
- eclipse中安装Kotlin插件后的问题
- spring对javamail的封装使用
- java swing设置背景颜色的问题
- Java 定时任务Timer
- java环境配置
- jdk代理