冒泡排序(Bubble_sort)
原理:
临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似。
它适合数据规模很小的时候,而且它的效率也比较低,但是作为入门的排序算法,还是值得学习的
代码
public class BobbleSort extends Object
{
public static void main(String args[])
{
int i,j,tmp;
int data[]={6,5,9,7,2,8};
System.out.println("冒泡排序法:");
System.out.print("原始数据为:");
for(i=0;i<6;i++)
{
System.out.print(data[i]+" ");
}
System.out.print("\n");
for (i=5;i>0;i--)
{
for (j=0;j<i;j++)
{
if (data[j]>data[j+1])
{
tmp=data[j];
data[j]=data[j+1];
data[j+1]=tmp;
}
}
System.out.print("第"+(6-i)+"次排序后的结果是:");
for (j=0;j<6;j++)
{
System.out.print(data[j]+" ");
}
System.out.print("\n");
}
System.out.print("排序后结果为:");
for (i=0;i<6;i++)
{
System.out.print(data[i]+" ");
}
System.out.print("\n");
}
}
算法复杂度:
最坏情况的时间复杂度是O(n²)。
优化冒泡排序:
从上面我们可以知道冒泡排序的核心是两两对比进行交换。如果有一个无序数列(2,1,3,4,5,6,7,8,9,10)。从第一次循环交换后的操作,可以说都是没必要的。所以,这些操作就是我们需要优化的地方。所以,我们可以通过设置一个标记变量,标记数列中的数是否在循环结束前就已经排好序
public class extends Object
{
int data[]=new int[]{4,6,2,7,8,9};
public static void main(String args[])
{
System.out.print("改良冒泡排序法\n原始数据为:");
CH08_02 test=new CH08_02();
test.showdata();
test.bubble();
}
public void showdata () //利用循环打印数据
{
int i;
for (i=0;i<6;i++)
{
System.out.print(data[i]+" ");
}
System.out.print("\n");
}
public void bubble ()
{
int i,j,tmp,flag;
for(i=5;i>=0;i--)
{
flag=0;
for (j=0;j<i;j++)
{
if (data[j+1]<data[j])
{
tmp=data[j];
data[j]=data[j+1];
data[j+1]=tmp;
flag++;
}
}
if (flag==0)
{
break;
}
System.out.print("第"+(6-i)+"次排序:");
for (j=0;j<6;j++)
{
System.out.print(data[j]+" ");
}
System.out.print("\n");
}
System.out.print("排序后结果为:");
showdata ();
}
}