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

# Java实现冒泡排序—详细解析优化版冒泡

2017-09-26 20:31 204 查看
# Java实现冒泡排序—详细解析优化版冒泡

思想:冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个相邻元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

时间复杂度:最优时间复杂度,最差时间复杂度分析和平均时间复杂度均为 O(n^2),主要的推算公式示通过等差数列s=n(n-1)/2;

空间复杂度:空间复杂度就是在交换元素时那个临时变量所占的内存空间;

最优的空间复杂度就是开始元素顺序已经排好了,则空间复杂度为:0;

最差的空间复杂度就是开始元素逆序排序了,则空间复杂度为:O(n);

平均的空间复杂度为:O(1);

代码块

public void getResult(int[] arr){
boolean flag;
for(int i=0;i<arr.length-1;i++)
{
flag=false;
for(int j=0;j<arr.length-i-1;j++)
{
if(arr[j]>arr[j+1])
{
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
flag=true;
}
}
if(flag==false)
{
break;
}
}
}


结果



分析:

1. 假设初始化数组为int[] array={33,27,56,98,70}

当外循环i=0时,内循环j=0时 此时 array={27,33,56,98,70}

……

当外循环i=0时,内循环j=3时 此时array={27,33,56,70,98}已经完全排好序;比一起一般的排序方法本程序增加了一个标志位boolean flag,这样就大大减少循环次数,提高程序执行效率;

2.1.当i=0的时候内循环j经过4次循环,已经排好序;当i=时,标志位flag重置为false,但内循环已经不需要再次排序换位了,所以直接break 跳出;

2.冒泡排序思路(第一层)是先从第一个数开始冒泡(对应数组中的a[0]的值),然后与第二个数进行比较(对应数组中的a[1]的值)。

a.假如a[0]>a[1],则a[0]与a[1]交换位置。小的值放在前面,大的值放在后面。也就说a[1]的位置现在放在第一位了,而a[0]的放在在第二位,但是a[0]继续与后面的数值进行比较。道理和a[0]与a[1]的过程一样。直到找出该数组的最大的值。并把这个最大值放在最后面的位置。第一层排序结束。

b.假如a[0]<a[1],则a[0]与a[1]不交换位置。第一个if条件没有执行。然后j++,然后变成a[1]与它相邻的右边的a[2]进行比较,以次类推,直到第一层排序结束,并把最大的值冒泡到最尾的位置。


3.难点:1.外循环控制循环的次数,若初始化以0开始就至n-1;若初始化以1开始就至n;建议一般初始化以0开始,因为数组的下标就是以0开始;

2.内循环控制交换的次数,当i=0第一次循环结束后就把最大那位数已经冒出来,所以当i=1时,内循环需要n-i-1,即不用和最大那位数重复比较;随着i值的增大,循环的次数越来越少;

算法初学者,以上分析参考了网上一些博客,根据自己总结写出来的,如有异议请勿喷,欢迎指正;

-
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: