冒泡排序是一种思想简单,便于理解和实现的排序算法,也许是很多人学习的第一个排序算法,废话不多说,我们来实现它
算法详解
我们以升序排列为例,算法的思想是,遍历整个数组,依次对数组中的每两个数进行比较大小,通过两个数字的交换,达到将最大的元素移动到数组的最后的目的,然后再次进行遍历,将第二大的数字移动到数组的倒数第二个位置…这样一次次遍历下来,数组将变为有序。举例如下,假设有一串数,以降序排列,现在我们要将它变为升序,这对于冒泡排序是最坏的一种情况
数组的变化如下:
原数组:
6,5,4,3,2,1
第一次遍历:
5,6,4,3,2,1
5,4,6,3,2,1
5,4,3,6,2,1
5,4,3,2,6,1
5,4,3,2,1,6
第二次遍历:
4,5,3,2,1,6
4,3,5,2,1,6
4,3,2,5,1,6
4,3,2,1,5,6
4,3,2,1,5,6(多余)
第三次遍历
3,4,2,1,5,6
3,2,4,1,5,6
3,2,1,4,5,6
3,2,1,4,5,6(多余)
3,2,1,4,5,6(多余)
第四次遍历
2,3,1,4,5,6
2,1,3,4,5,6
2,1,3,4,5,6(多余)
2,1,3,4,5,6(多余)
2,1,3,4,5,6(多余)
第五次遍历(多余)
1,2,3,4,5,6
1,2,3,4,5,6(多余)
1,2,3,4,5,6(多余)
1,2,3,4,5,6(多余)
1,2,3,4,5,6(多余)
规律
1.对于内部交换操作,我们可以看到,每进行一次遍历,就会有一个新的数的比较操作是多余的,也就是说,我们只需要交换
2.最后一次遍历是多余的
3.对于内部交换,只用比较 数组长度-1 次,以第一次遍历为例,数组长度是6,但实际上我们的内部交换操作只比较了5次就足够了
java代码实现:
public static void main(String[] args) {
int[] a= {6,5,4,3,2,1};
for(int i=0;i<a.length-1;i++)
{
for(int j=0;j<a.length-i-1;j++)
{
if(a[j]>a[j+1])//交换操作
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(int s:a)//遍历数组中的元素并输出
{
System.out.println(s);
}
}
总结
事实上,很多算法都是通过找规律得出来的,当我们研究算法遇到瓶颈时,不妨把算法每一步的变化在纸上画出来,然后像上小学时找规律一样找到其中的规律,然后就容易得多了。