选择排序(数组随机生成)

选择排序:
	45 32 56 90 21
	每一轮里面选最小值和第i个元素进行交换,就是先选第一个为最小值,然后从剩下的选出最小值和第一个选的最小值
	进行比较,如果比第一次选的最小值还小就交换
	刚开始i = 0(第一轮) min = 45;minIndex = 0;  然后从i + 1这个位置开始往后循环,就是在32和21之间我们找最小值
	45和32比较,32小,然后记录min = 32;minIndex =1;56和90明显比32大,到了21这个位置,比31小,所以
	min = 21;minIndex = 4 到这步也就是我们把第一轮的最小值找到了,然后45和21进行比较,在进行交换,紧接着
	i = 1(第二轮)  min = 32 minIndex = 1,就是在56和45间找到最小值,没有,所以32自己就是最小值
	i = 2(第三轮)min = 56 minIndex = 2, 就是在90和45找到最小值,90跳过,到45,然后56和45进行交换
	i = 3(第三轮)min = 90 minIndex = 3, ..............
	每轮循环,交换i的值和minIndex的值
	冒泡里面,只要它大于/小于它,就要交换,  计算机系统里比较耗费效率操作就是变量的赋值和变量的操作
	50000多次,就是每次交换都要一个临时变量,然后在if里面用完了又销毁,很浪费时间
	选择里面,交换次数是固定的和外循环的次数一样的,内循环里没有交换,只是找,赋值操作
/**
 * 
 * 选择排序
 * @author Monster丶ZF
 * @version1.8
 * @data 2019年4月13日
 * @remakeTODO
 */
public class KuaiSuDemo {
	public static void main(String[] args) {
		//每轮循环,交换i的值和minIndex的值(x下标值)
	final int N = 10;
	int[] nums = new int[N];
	for (int i = 0; i < nums.length; i++) {
		nums[i] = (int)(Math.random() * 1000) % 201;
	}
	long startTime = System.currentTimeMillis();
	System.out.println("排序前:");
	for (int i = 0; i < nums.length; i++) {
		System.out.print(nums[i] + "\t" );
	}
	System.out.println();
	for (int i = 0; i < nums.length; i++) { // 外循环控制轮数
      int min = nums[i];   //假设第i个是最小值
      int minIndex = i ;   //最小值的下标
      for (int j = i + 1; j < nums.length; j++) { // 内循环从i + 1的位置开始,很单纯,就找最小值和最小值的下标
    	  if(min >  nums[j]){
    		  min =nums[j];            //内循环值是记录最小值,没有交换,就只是赋值。
    		  minIndex = j;	  
    	  }
	}
      int temp = nums[i];
      nums[i] = nums[minIndex];    //交换次数和外循环是一样的
      nums[minIndex] = temp;
	}
	System.out.println("排序后:");
	for (int i = 0; i < nums.length; i++) {
		System.out.print(nums[i] + "\t");
	}
	System.out.println();
    long endTime = System.currentTimeMillis();
    System.out.println((endTime-startTime) + "毫秒");
	}

}

猜你喜欢

转载自blog.csdn.net/w15977858408/article/details/89290886
今日推荐