排序算法--选择排序(Java实现)

选择排序概念

        选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike

思想
*     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
*     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
*     当进行下一次排序时,范围缩小1

代码实现

package com.lll.datastructure.sort;

import java.util.Arrays;

/**
 * 
* @ClassName: SelectionSort
* @Description: 选择排序
* @Author: liulianglin
* @DateTime 2022年9月7日 上午9:12:13
* 
* 选择排序思想:
* 	每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
* 	长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
	当进行下一次排序时,范围缩小1
 */
public class SelectionSort {
	public static void main(String[] args) {
		// 待排序数据
		int[] arr = {1,3,2,4,7,54,11,34,9}; 
		
		// 记录当前趟数查找到的最大值的数组下标 
		int max;
		
		// 交换变量
		int temp;
		
		System.out.println("排序前:" + Arrays.toString(arr));

		// 外层控制循环需要排序的趟数
		for(int i = 0; i < arr.length - 1; i++) {
			// 每一趟都默认数组第一个元素为最大值
			max = 0;
			
			// 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标
			for (int j = 0; j < arr.length - i; j++) {
				if (arr[j] > arr[max]) {
					max = j;
				}
			}
			
			// 将交换变量设置为最大值, 将最大值暂存一下
			temp = arr[max];
			// 将当前最大值设置为当前未排序序列的最后一个元素值
			arr[max] = arr[arr.length - 1 - i];
			// 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换
			arr[arr.length - 1 - i] = temp;
		}
		
		System.out.println("排序后:" + Arrays.toString(arr));
	}
}

关键步骤:

1. 首先定义两个变量:分别表示最大值标 和 交换变量;

2. 通过外层for循环,控制排序的趟数;

3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;

4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;

5.然后将最大值设置为当前未排序序列的最后一个元素;

6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素

7.至此完成数据交换,继续进行步骤2,直到数据数据有序。

 执行结果

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值