今天偶然看到这个排序方法,就想着用代码实现一下,那就趁热打铁就分享下我的思路吧,下面从这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++
则大体框架有了:
for(int 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");
// 将数组打印出来
}
}
}