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

JavaSE基础 - 数组排序之冒泡排序

2018-03-30 00:23 204 查看
冒泡排序的原理:每次把最大(或最小)的那个数,通过里层的循环冒泡到末端,然后通过外层循环对剩下的数再进行一次(重复)冒泡操作。
冒泡排序的时间复杂度:冒泡排序的最好情况下时间复杂度为

;最坏的情况下时间复杂度为


冒泡排序的次数:N个数比较N-1遍。(未改进的情况下)

现在,我用数组元素为:89,-3,43,12,69 为例(递增排序)图解。



过程解释:
第一次:89大于后面的数,冒泡到最末端,得到第一次比较最大的数89.
第二次:-3 < 43,位置不变;43 > 12,交换位置;43 < 69,位置不变。得到第二次比较最大的数69.
第三,四次:可以发现,虽然第三次已经有序,但是还要走第四次。
最终得到排序数组:-3,12,43,69,89.
代码如下:public class BubbleSort
{
public void sort(int[] a)
{
int temp = 0;
for (int i = a.length - 1; i > 0; --i)
{
for (int j = 0; j < i; ++j)
{
if (a[j + 1] < a[j])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
}图解过程中,我们发现,第三次排序时,数组已经有序,但是还是要继续冒泡,无疑增加了时间复杂度,如果我们能在数组已经有序的时候就结束循环,岂不是更好.
冒泡排序的改进:改进在数组排序过程未完成,而数组已经有序列的情况下,结束循环。代码如下:public static void bubbleSort(int[] list)
{
boolean isSorted = true; //添加有序标志。
for (int i = 0; i < (list.length - 1) && isSorted; i++)
{
isSorted = false;
for (int j = 0; j < (list.length - 1 -i); j++)
{
if (list[j] > list[j + 1])
{
int temp = list[j];
list[j] = list[j + 1];
list[j + 1] = temp;
isSorted = true;
}
}
}
} 若某次循环时,内层循环的if语句未被执行,则isSorted = false.外层循环的条件不满足,终止循环。

总结:冒泡循环是排序算法中最为基础的,掌握并理解它是必不可少的。希望我的文章对你有所帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息