首先,我们先说下冒泡法(以升序为例,既: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");
	}
	
}