12、冒泡排序算法
冒泡排序算法运作如下:(从后往前)
比较相邻的元素。如果第一个比第二个大,就交换他们两个。‘
对每一对相邻元素做同样工作,从开始第一对到结尾最后一队。在这一点,最后的元素应该是最大的数。
针对所有元素做同样的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
按照上面的说法,我们比较一下下面的元素:
int[] nums = {86,54,23,7,90,48,11,66};
已经设置了上面的元素,都有
86 54 23 1 90 48 11 66
冒泡排序(从小到大):
54 23 1 86 48 11 66 90 第一轮,比较了7次,把最大的放到了最后
23 1 54 48 11 66 86 第二轮,比较了6次,把次大的放到了倒数第二
1 23 48 11 54 66 第三轮,比较了5次,把第三大的放到了倒数第三
1 23 11 48 54 第四轮,比较了4次,把第四大的放到了倒数第四
1 11 23 48 第五轮,比较了3次,把第五大的放到了倒数第五
1 11 23 第六轮,比较了2次,把第六大的放到了倒数第六
1 11 第七轮,比较了1次,把第七大的放到了倒数第七
结束!排出来为:1 11 23 48 54 66 86 90
我们来试试:
public class a
{
public static void main(String[] args)
{
int[] nums = {86,54,23,7,90,48,11,66};
int len = nums.length;
//外循环控制轮数,比较轮数等于数列长度减一
for(int i = 0 ; i < len-1; i++)
{
for(int j = 0 ; j < len-(i+1) ; j++)
{
if(nums[j] > nums[j+1])
{
nums[j+1] = nums[j] + nums[j+1];
nums[j] = nums[j+1] - nums[j]; //if为两数排列
nums[j+1] = nums[j+1] - nums[j];
}
}
}
//输出结果
for(int x : nums)
{
System.out.print(x+" ");
//System.out.print("\t");
}
}
}
我们再说一下稳定排序与不稳定排序区别:如果有这样一个数列:[7,2,4,4,6,8],排完之后是[2,4,4,6,7,8]。如果数列中第一个4在排完后是在第二个4前面,就说这个算法是稳定排序,否则就是不稳定排序。