目录
一.原理分析
冒泡排序是效率较低的排序方法 之所以称之为冒泡就是在排序的过程中数组中的元素最大值会不断的向后移动到数组尾部
冒泡排序实现是代码中是双层循环来写的 外层循环控制趟数也就是内层循环控制的是每趟中的元素移动的
如图 总共十个元素 外层循环十次 每次循环都会将数组的较大值放在底部 如第一次排序将7336排序到了尾部 那么第二趟排序将第二大的值放入他的前面即可 在经历10趟下 数组就会变为有序
二.代码的实现
public static void Bubble_Sort(int []array)
{
//冒泡排序每次排序都会将最大数字沉底 然后通过 不断排序将所有最大数都不断沉底
for (int i=0;i<array.length;i++) {
boolean flag =true;
for (int j = 0; j < array.length - i - 1; j++)
if (array[j] > array[j + 1])
{
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
flag=false;
}
if (flag)
return;
}
}
三.代码的解析部分
首先冒泡排序前面说了他的表现是把数组中的较大值不断向后移动
if (array[j] > array[j + 1])
{
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
flag=false;
}
比较相邻元素 如果大于则进行交换 实际移动就是靠将相邻位置的值交换配合内层循环变量的自增 确保最大值不断的向后移动
这里存在一个boolean值他的作用就是加快冒泡排序的 如果我们传入的数组已经是有序的了 在做循环判断就已经没有必要了 在内层循环的最开始 这个flag变量是为true的如果内层循环交换了相邻元素的值就说明数组还未排序好 这个时候flag就为false 也就是内层循环只要交换一次 flag值都会变为false 说明数组尚未排序成功 如果没有一次相邻位置交换数据 那就说明不需要循环了跳出
四.最坏最好情况分析
最坏情况下数组是从大到小的情况排序的 所以双循环的每一次内层循环都要交换相邻位置的数字 时间复杂度是O()
最好情况下就是数组已经是从小到大排列不需要排序 内层循环结束就会用flag跳出外层循环时间复杂度是O(n)
正常情况下 平均时间复杂度是O() 从这里也预测了 这个排序方法在数据量超大的时候排序速度将会极其慢
五.排序时间分析
排序耗时分析需要用到一个方法 该方法是System类的静态方法 返回值是Long型的具体是
System.currentTimeMillis();返回值是从1970年1月1日到现在的毫秒值
long begin = System.currentTimeMillis();
Sort.Bubble_Sort(array);
long end=System.currentTimeMillis();
// 记录 多少毫秒
long ms=(end-begin);
System.out.println("\n运行时间排序"+max+"数字总共耗时"+ms+"毫秒");
这样就可以获取到允许排序算法的时间长度
数据均为自己测试所得 不同计算机排序时间有所差异
千个数字 10毫秒
万个数字 45毫秒
十万个数字111149毫秒
百万数字1149102毫秒