千峰Java教程:030. 选择排序算法

13、选择排序算法

选择排序算法:

每一趟从待排序的数据中选出最小(或最大)的一个元素,顺序放在已排好数列的最后,直到全部待排序的数据全部排序完成。选择排序是一种不稳定排序算法。此效率比冒泡效率要高一点。

 

假如有这样一个数组:[86,54,23,7,90,48,11,66],从小到大排:

第一次比较:记86(第一个数)为最小值,86跟54比较54小交换,再拿54与23比较23小交换,23与7比较7小交换,7与90比较7小不交换,7与48比较7小不交换,7与11比较7小不交换,7与66比较7小不交换,比较了7次;最后为:[7,86,54,23,90,48,11,66],第一个最小值得出。

第二次比较:记86(此时为第二个数)为最小值,86跟54比较54小交换,再拿54与23比较23小交换,23与90比较23小不交换,32与48比较23小不交换,23与11比较11小交换,11与66比较11小不交换,比较了6次;最后为:[7,11,86,54,90,48,23,66],第二个最小值得出。

第三次比较:记86(此时为第三个数)为最小值,86跟54比较54小交换,54跟90比较54小不交换,54跟48比较48小交换,48与32比较23小交换,23与66比较23小不交换,比较了5次;最后为:[7,11,23,86,90,54,48,66],第三个最小值得出。

第四次比较:记86(此时为第四个数)为最小值,86与90比较86小不交换,86与54比较54小交换,54与48比较48小交换,48与66比较48小不交换,比较了4次;最后为:[7,11,23,48,90,86,54,66],第四个最小值得出。

第五次比较:记90(此时为第五个数)为最小值。90与86比较86小交换,86与54比较54小交换,54于66比较54小不交换,比较了3次;最后为:[7,11,23,48,54,90,86,66],第五个最小值得出。

第六次比较:记90(此时为第六个数)为最小值,90与86比较86小交换,86与66比较66小交换,比较了2次;最后为:[7,11,23,48,54,66,90,86],第六个最小值得出。

第七次比较:记90(此时为第七个数)为最小值,90与86比较86小交换,比较了1次,最后为:[7,11,23,48,54,66,86,90],结束。

 

我们来实现这个算法:

public class a
{
	public static void main(String[] args)
	{
		int[] nums = {86,54,23,7,90,48,11,66};
		int len = nums.length;
		int minIndex;//用于记录每次比较最小值的下标
		for(int i = 0;i < len-1 ; i++)
		{//控制轮数
			minIndex = i;//每轮假设一个最小值下标
			for(int j = i+1;j < len; j++)//i+1:每一轮都往上加了一次
			{
				if(nums[minIndex] > nums[j])
				{
					minIndex = j;
				}
			}
			//判断需要交换的数是否为自己
			if(minIndex != i)
			{
				nums[minIndex] = nums[i] + nums[minIndex];
				nums[i] = nums[minIndex] - nums[i];
				nums[minIndex] = nums[minIndex] - nums[i];
			}
		}
		//输出结果
		for(int x : nums)
		{
			System.out.print(x+" ");
			//System.out.print("\t");
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值