排序算法02-选择排序算法

本文详细介绍了选择排序算法的工作原理,通过双重循环实现数组的升序排序。每一轮排序确定一个位置上的最小(或最大)数值,最终完成整个数组的排序。代码示例展示了选择排序的具体实现过程,并输出了每轮排序的结果。文章讨论了该算法的优化可能性。
摘要由CSDN通过智能技术生成

选择排序算法

选择排序算法,个人觉得可以通过定位置选数值的想法来考虑。

比如数组中的第一个位置,就放数值最小的那个数;第二个位置,放数值第二小的那个数……依次类推,最后的一个位置,就放数值最大的那个数。由此,我们就可以完成整个数组,从小到大的升序排序。

想法有了,那我们要做的,就是在所有数中,为相应位置找到正确的数,并放置好。

以第1个位置的数a[0]为例,我们用a[0]和后面的数(a[1]、a[2]、a[3]……)逐个对比,只要发现比a[0]数值小,就和a[0]进行数值交换,交换完成,继续用a[0]和后面的数比较,如果还发现比当前a[0]的数值小,继续交换,重复这个步骤直到这一轮结束,经过一轮比较下来,第1个位置上放置的数a[0]就是整个数组中,数值最小的数了。

后面的第2个位置、第3个位置……都是如此进行。

来看下具体的实现代码:

package com.daily;

import java.util.Arrays;

/**
 * 
 * @description 
 * 选择排序算法:
 * 1、用双重循环实现,第一层循环,用以控制整个数组排序的轮数,,总共的排序轮数是arr.length-1,每一轮排序结束,都会确定好一个位置
 * 2、第二层循环,用以控制当前这第i轮排序中,arr[i]这个元素与后面每一个元素(arr[i+1]、arr[i+2]......arr[arr.length-1])的比较
 * 3、选择排序中,第一轮排序确定的是第一个位置的数(也是数值最小的),第二轮排序确定的是第二个位置的数,依次类推
 * 将所有数按照先排数值小的再排数值大的,完成整个排序
 * 
 * @author yuhuofei2021
 * @date 2021年6月12日
 */
public class SelectionSort {
	
	public static void main(String[] args) {
		int[] arr = {3,9,72,1,56,20,2,50};
//		Arrays.sort(arr);		采用类Arrays的方法
//		System.out.println(Arrays.toString(arr));
		select(arr);
	}

	/**
	 * 
	 * @description 选择排序具体实现
	 * @author yuhuofei2021
	 * @date 2021年6月12日 
	 * @param arr
	 */
	public static void select(int[] arr) {
		for (int i = 0; i < arr.length - 1; i++) {
			for (int j = i + 1; j <= arr.length - 1; j++) {
				if (arr[i] > arr[j]) {
					int temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
				}
			}
			//每比较完一轮,打印出当前这一轮的比较结果
			System.out.println("第"+ (i+1) + "轮排序的结果:" + Arrays.toString(arr));
		}
		//打印最后排序的结果
		System.out.println("最后排序结果:" + Arrays.toString(arr));
	}
}

输出结果如下:

1轮排序的结果:[1, 9, 72, 3, 56, 20, 2, 50]2轮排序的结果:[1, 2, 72, 9, 56, 20, 3, 50]3轮排序的结果:[1, 2, 3, 72, 56, 20, 9, 50]4轮排序的结果:[1, 2, 3, 9, 72, 56, 20, 50]5轮排序的结果:[1, 2, 3, 9, 20, 72, 56, 50]6轮排序的结果:[1, 2, 3, 9, 20, 50, 72, 56]7轮排序的结果:[1, 2, 3, 9, 20, 50, 56, 72]
最后排序结果:[1, 2, 3, 9, 20, 50, 56, 72]

从每一轮的输出结果,我们可以看出,一轮排序结束,都会确定下来一个位置上的数。例如,第1轮排序结束,确定了第1个位置上的数是1,第2轮结束确定了第2个位置上的数是2,第3轮则是3,第4轮则是9……

关于选择排序法,还可以考虑是否有可以优化的地方。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值