首先,我们先说下冒泡法(以升序为例,既:1,2,3,4,5这个顺序),其原理就是相邻两个数相比,如:a[ i ]与a[ i+1]比较,如果前面的比后面大,则这两个数交换,把大的数交换给a[i +1],小的数交换给a[ i]; 下次比较就是a[i +1] 与 a[i+2],继续上一次的操作,如果后面的大于前面的,则两个数交换,如果前面小于后面,则不要交换,继续往后走。这样一直把最大的数推向了数组的最后一个位置。然后循环一次找到后面的。
选择法,就是通过一个变量m来记录最大或者最小那个数的下标,假若只有两个循环,在第二个循环中就是寻找最大或者最小的下标。找到最小或者最大后就把这个数与数组中第一个数交换,后面依次这样循环,代码如下。
package com.lovo;
/**
* 本程序是介绍了两种排序方法,冒泡法和选择法。
* @author 杜海
*
*/
public class Paixu {
public static void main(String[] args) {
int[] a=new int[10];
System.out.println("原来数组的顺序为:");
for(int i=0;i<a.length;i++){
a[i]=(int) (Math.random()*100+1);
System.out.print(" "+a[i]);
}
System.out.print("\n");
/**
* 冒泡法排序,以升序为例子
*/
System.out.println("冒泡法排序(升序):");
for(int i=0;i<a.length-1;i++){ //冒泡法排序,注意边界条件,第一个循环,10个数,只需要比较9次,所以要减1;
for(int j=0;j<a.length-i-1;j++){ //第二个条件,在第一个大循环完成后,找出了最后一个数为最小,所以最后一个数就不需要比较了,所以需要减i,
if(a[j]>a[j+1]){ // 至于为什么要减1,那是因为第二个循环是j和j+1在比较,如果不减1,在第一次大循环比较时,会超出数组的范围。
int temp=0;
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(int i=0;i<a.length;i++)
System.out.print(" "+a[i]);
System.out.print("\n");
System.out.println("************华丽的分隔符************");
/**
* 选择法排序(降序)
*/
System.out.println("选择法排序(降序):");
for(int i=0;i<a.length-1;i++){ //还是边界问题,选择法在找出了前9个数后,最后一个就不要在寻找了,你找或者不找,它就在那儿
int m=i; //m是为了寻找最大的那个数的下标。
for(int j=i;j<a.length-1;j++){ //每找到一个数,j就随着i变大,每次循环m=i=j;所以需要跟j+1比较,所以需要减1.
if(a[m]<a[j+1]){
m=j+1;
}
}
int temp=0; //在第二个循环中找到了最大的那个数的下标,此时这个数与a[i]交换
temp=a[i];
a[i]=a[m];
a[m]=temp;
}
for(int i=0;i<a.length;i++)
System.out.print(" "+a[i]);
System.out.print("\n");
}
}
。