选择排序

今天偶然看到这个排序方法,就想着用代码实现一下,那就趁热打铁就分享下我的思路吧,下面从这3个方面说说

选择排序(SelectionSort):

  • 思想及演示
  • 我是如何分析它的,以及如何将分析转化成代码的
  • 代码实现

1. 思想:
思想很简单:就是将第i个数分别和N-i比较,如果i<每个比较的数,那么这两个数就交换(i为数组下标,N为数组的个数)举个例子吧:
------------------- 【2,6,0,1,8】 ———>原始数组
第一圈(第一个数分别和后四个数比较):
第一次:2和6比较,6大于2,不交换
第二次:2和0比较,0小于2,交换 。此时为:【0,6,2,1,8】
第三次:0和1比较,1大于0,不交换
第四次:0和8比较,9大于0,不交换

第一圈结果:【0,6,2,1,8】,此时确定了最小值

第二圈(第二个数分别和后三给数比较):
第一次:6和2比较,2小于6,交换。此时为:【0,2,6,1,8】
第二次:2和1比较,1小于2,交换。此时为:【0,1,6,2,8】
第三次:1和8比较, 8大于1,不交换

第二圈结果:【0,1,6,2,8】,此时确定了两个最小值了

第三圈(第三个数分别和后两个数比较):
第一次:6和2比较,2小于6,交换。此时为:【0,1,2,6,8】
第二次:2和8比较,8大于2,不交换。
第三圈结果:【0,1,2,6,8】,此时确定了三个最小值了

第四圈(第四个数和最后一个数比较):
第一次:6和8比较,8大于6,不交换。

最终结果:【0,1,2,6,8】

===============================================
2、我是如何分析它,以及将分析转换成代码的:
分析:首先将上述数组初始化定义一波:
int[] arr = {2,6,0,1,8}(没排序之前的)
通过有四圈,以及每圈里面又有比较和交换我们可以用for循环嵌套和if 判断来表示,外层很简单,有arr.length个数,我们只要筛选出arr.length-1个最小的就行,所以外层为:for(int i = 0;i < arr.length-1;i++)
难点在里层我们,我们不妨找找规律:

第一圈:arr[0]  和   arr[4]、    arr[3]、    arr[2]、    arr[1] 比较
			      |  4=5-0-1      3=5-1-1   2=5-2-1   1=5-3-1 |
---------------------------------------------------------------------------
第二圈:arr[1]  和  arr[4]  、    arr[3] 、     arr[2] 比较
				  |  4=5-0-1      3=5-1-1     2=5-2-1 |
----------------------------------------------------------------------------
第三圈: arr[2] 和    arr[4] 、 arr[3]  比较
				   |  4=5-0-1      3=5-1-1 |
----------------------------------------------------------------------------
第四圈: arr[3] 和  arr[4] 比较
				 	| 4=5-0-1 |
----------------------------------------------------------------------------

聪明的你一定发现了其中的规律吧:
我们可以发现 " | | “内的数每次都有 “5-1”这个常量对吧,还有一个变量,它呢每圈减的次数都不一样,第一圈是 0——3,第二圈是0——2,第三圈是0——1,第四圈是0,所以我们不妨引入零一个变量 “j”,并给他初始化j=0,第一次要循环四次 则"j <5-0-1;j++;“第二次要循环三次,则"j<5-1-1;j++”,第三次要循环两次,则 “j<5-2-1;j++”,第四次要循环一次,则” j<5-3-1", 我们可以发现加粗的部分正好是对应的 i,则可以抽象出来:j=0;j<5-i-1;j++
则大体框架有了:

forint i =0;i < arr.length-1;i++) {
	for (int j = 0;j < arr.length-i-1;j++) {
	
	}
}

下面就是比较和交换了:arr[i] 和 **arr[arr.length-j-1]**比较如果小于则交换

int temp = 0;
if (arr[i] < arr[arr.length-i-1]) {
		temp = arr[i];
		arr[i] =arr[arr.length-j-1];
		arr[arr.length-j-1] = arr[i]
}

= = = = = = = = = = = = =OK了= = = = = = = = = = = = = = = = =

4、上完整代码

class SelectionSort 
{	// 选择排序思路:将第i个数分别与N-i个数比较,只要i小于所比较的数,就交换位置

	public static void main(String[] args) 
	{		int temp = 0;
		int[] arr = {23,9,12,-2,0,8};
		for (int i = 0;i < arr.length-1;i++) { // 外层控制圈数
			for (int j = 0;j < arr.length-i-1;j++) {
				if (arr[i] < arr[arr.length-j-1]) {
					temp = arr[i];
					arr[i] = arr[arr.length-j-1];
					arr[arr.length-j-1] = temp;
				// 此时已经将数组排好序了
				}	
				
			}
		}
		for (int i = 0;i < arr.length-1;i++) {
		 System.out.print(arr[i] + "\t");
		 // 将数组打印出来
    } 
	}
}

=================我再分享个= = ==================

public class Copy {
	// 此法是后想出来的,比较好懂点
	public static void main(String[] args) {
		 int[] arr = {21,44,90,123,41};
		 int temp = 0;
		   for (int i = 0;i < arr.length-1;i++) {
			   for (int j = i + 1;j<arr.length;j++) {
				   if (arr[i] > arr[j]) {
					   temp = arr[i];
					   arr[i] = arr[j];
					   arr[j] = temp;
				 // 此时已经将数组排好序了  
				   		}
				   }
		   }
		 for (int i = 0;i < arr.length-1;i++) {
		 System.out.print(arr[i] + "\t");
    	// 将数组打印出来
    } 
		 
    } 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值