十大排序之选择排序《Blind-Stab》

选择排序

  • 选择排序可能是最简单的排序吧,就是比较一个一个比较。
  • 两层for循环,时间复杂度是O(n平方)
  • 最外层循环控制次数,里面循环用于寻找当前最小的
  • 找到了之后与第一个进行交换,然后外层循环完成了一个单位

话不多说,上代码!

public class Choose {
	public static void main(String[] args) {
		
		int [] arr = {0,1,6,9,8,7,5,3,55,44,6};
		
		for (int i = 0; i < arr.length - 1; i++) {
			  int min = arr[i]; int index = i;
			for (int j = i+1; j < arr.length; j++) {
				if(min>arr[j]) {
					min = arr[j];
					index = j;
				}
			}
			int temp = arr[i];
			arr[i] = arr[index];
			arr[index] = temp;
		}
		
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + "  ");
		}
	}
}

分析:

n个数据,进行选择排序,顺序若是从小到大排序。它的核心思想是:每次遍历找出最小的,交换后放在最左边,i++;

两层for循环,外层用来记录已经找了第几次最小的了,里层用来每次找最小的。

优化:

最外层其实遍历n-1次就行,因为倒数第二个最小的出来了,最后一个肯定是最大的,并且可以不用设置变量min,全部用arr[index]替代就行。

拓展:

交换那里,可以不引入temp中间变量,根据算法逻辑:a ,b两个数,交换->    a = a + b;b = a - b;a = a - b;   有这三个式子就完成两个数的交换了,这是典型的时间换空间理念。步骤多了,但是变量少了。

注意事项:

很多新手容易将 int index = i;写成int index = 0;这种写法的问题在于,当连续两个依次最小的时候,比如 3,2,1;第一次确实是找出了1最小,然后和3交换了,变成了1,2,3。但是接下来,2比3小,它便不会进入if(){}这里面,也就是index的值没有改变还是0,那么它交换的时候就是2和1交换了变成了2,1,3。这很明显是错误的。也就是说index是个变动的,它指的就是最小值的角标,而不是固定的某一个数,也就是说他要上下统一,随时都有可能会变动,不能固定赋值。

 

 

ok完了

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值