public class SortTest
{
public static void main(String[] args)
{
//System.out.println("hello world");
//int a[]={11,4,4,6};
//int[] a = {6,4,5,7};
int a[]={5,6,7,8,9,98,8};
System.out.println("bubbleSort ----------");
bubbleSort bubble = new bubbleSort();
bubble.sortMethod(a);
/*System.out.println("quickSort --------");
quickSort quick = new quickSort();
quick.sortMethod(a);
tbc*/ }
}
abstract class Sort
{
public abstract void sortMethod(int init[]);
}
class bubbleSort extends Sort
{
public void sortMethod(int init[])
{
int i,j ;
int temp;
for(i = 0 ; i < init.length; i++)
{
for(j = i+1 ; j < init.length; j++)
//j不能从0开始取,这样第一轮虽然是变成最小的数在最左面,但是第二轮开始,第一个数又得被换次小的数。最终形成(6457-->4567-->5467-->6547-->7654)
//也不能写成j=i++,这样第一次比较的都是当前待比较元素的后一位是不是比自己大。大的话,把最小的元素放到第二位。(6457-->6457)
//然后,j的for循环之后,i++,i这样自增了两次。这才比较的是当前待比较元素的后两位是不是比当前待比较元素的后一位大。(6457-->6475)
{
if (init[i] > init[j])//小的元素左移
{
temp = init[i];
init[i] = init[j];
init[j] = temp;
}
}
}
for(i = 0; i < init.length; i++)
{
System.out.println(init[i]);
}
}
定义抽象类,并声明了一个抽象方法。上面 的冒泡排序两层for循环,思路很奇怪。外围的for循环不仅控制了进行多少趟排序还在内层循环体中起作用。冒泡排序每一趟的思想就是比较相邻两个元素的大小,大的往右边挤,再继续比较与它相邻的元素。上面的方法中通过i,j两个来控制待比较元素的下标。下面的程序更一般化,直接有j来控制待比较的两个元素的下标。
class BubbleSort
{
static void sort(int a[])
{
for(int i = 0; i < a.length - 1; i++)
{
for(int j = 0; j < a.length - 1 - i; j++)//由于每次外层进行一趟,就把当前未排序的数组中最大的数冒泡似得挤到最后,所以下次排序就可以去掉最后一个位置的数。节省时间。正好每一趟结束后i++,这样i自增一次,下一趟比上一趟就减少一个数的比较,故j = 上一趟数组的长度 - 1。
{
if(a[j] > a[j + 1])
{
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
public static void main(String[] args)
{
int[] a =new int[]{9,3,5,3,8};
BubbleSort.sort(a);
for(int i = 0; i < a.length; i++)
{
System.out.print(a[i]+" ");
}
}
}