您的位置:首页 > 编程语言 > Java开发

基本排序_冒泡排序_Java实现

2015-12-17 14:30 465 查看
转载请注明出处:/article/11557473.html

本文出自:【梁敬明的博客】

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)。

算法稳定性:

  冒牌排序是比较相邻的两个元素,交换也发生在两个元素之间,若两个元素相等,不会发生交换,相同元素的顺序不会发生改变。因此,冒泡排序是一种稳定的排序算法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: