简单选择排序的介绍:

从给定的序列中,按照指定的规则选出某一个元素,再根据规定交换位置后达到有序的目的。

简单选择排序的基本思想:

假定我们的数组为int [] arr = new int[n],第一次我们从arr[0]~arr[n-1]中选择出最小的值与arr[0]交换。第二次我们从arr[1]~arr[n-1]中选择出最小的值与arr[1]交换。第三次我们从arr[2]~arr[n-1]中选择出最小的值与arr[2]交换,...,第i次我们从arr[i-1]~arr[n-1]中选择出最小的值与arr[i-1]交换,...,第n-1次我们从arr[n-2]~arr[n-1]中选择出最小的值与arr[n-2]交换。我们总共进行n-1次的交换,从而得到一个由小到大的排序序列。

简单选择排序的思路详解:

例子:原始的数组:[101,34,119,1]

经过第一次选择排序之后,我们得到的数组:1,[34,119,101]

经过第二次选择排序之后,我们得到的数组:1,34,[119,101]

经过第三次选择排序之后,我们得到的数组:1,34,101,[119]

这个时候,我们的序列已经有序了,并且我们执行的次数一共是是4次(n-1)。

针对上述的例子我们进行说明如下:

(1).选择排序一共有数组大小-1(n-1)轮排序

(2).每一轮排序,又是一个循环,我们先假定每次循环的第一个数都是最小的数,然后和后面的每个数进行比较,如果发现有比当前更小的数,就重新确定这个最小的数,并且要得到这个数的下标。依次进行循环

上述过程在代码中我会通过注释说明。

下面的代码中,我会将选择排序通过两种代码实现:分步骤的实现,整体的实现。在代码中,我们测试的数组是:[101,34,119,1]

(1).分步骤的实现选择排序

public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {101,34,119,1};
selectSort(arr);
} //选择排序
public static void selectSort(int[] arr){
//第一趟排序
System.out.println("执行的第一趟排序:");
//首先我们要假设第一个元素是最小的,并且记录最小元素的下标,这里我们分别用min,minIndex表示。
int min = arr[0];
int minIndex = 0;
for(int j = 1+0;j<arr.length;j++){ //这是第一次的循环,我们要从第二个数开始算起,与第一个数比较。
if(min>arr[j]){ //当我们的min值大于后面的数时,说明min不是最小的,这时候,我们将min与最小的值交换,并且让minIndex索引变成最小值的索引。
min = arr[j];
minIndex = j;
}
}
//通过上面的交换,我们可以得到这趟序列中最小的元素的值。
//因为我们的第一个元素是我们指定的最小元素,因此在找到比第一个元素更小的元素后,我们应该让其与第一个元素交换。
arr[minIndex] = arr[0];
arr[0] = min;
System.out.println(Arrays.toString(arr)); //接下来的几趟排序与第一趟相同
//第二趟排序
System.out.println("执行的第二趟排序:");
min = arr[1];
minIndex = 1;
for(int j = 1+1;j<arr.length;j++){ //j=1+1这个需要注意,因为是第二趟排序,所以应该加1.
if(min > arr[j]){
min = arr[j];
minIndex = j;
}
}
arr[minIndex] = arr[1];
arr[1] = min;
System.out.println(Arrays.toString(arr)); //第三趟排序
System.out.println("执行的第三趟排序:");
min = arr[2];
minIndex = 2;
for(int j = 1+2;j<arr.length;j++){
if(min > arr[j]){
min = arr[j];
minIndex = j;
}
}
arr[minIndex] = arr[2];
arr[2] = min;
System.out.println(Arrays.toString(arr));
}

 上述代码我们得到的最终结果是:

(2).整体的代码实现

	public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {101,34,119,1};
selectSort(arr);
} //选择排序
public static void selectSort(int[] arr){ //选择排序的算法
//通过上面的分步,我们可以知道,可以通过循环嵌套来实现
for(int i=0;i<arr.length-1;i++){ //i代表的就是实现该算法的次数。,具体的解释可以看上述代码
int min = arr[i];
int minIndex = i;
for(int j=i+1;j<arr.length;j++){ //j=i+1这个地方就是代表了,j应该从i+1个位置开始算起,因为之前的已经排好序了~
if(min>arr[j]){
min = arr[j];
minIndex = j;
}
}
arr[minIndex] = arr[i];
arr[i] = min;
System.out.println("第"+(i+1)+"趟排序的结果:");
System.out.println(Arrays.toString(arr)); } }

  上述代码我们得到最终的结果是:

但是,还有一点值得注意的是,观察我们第二趟的结果,我们发现与第一趟的结果是相同的,也就是说,我们在进行选择排序的过程中,可能出现第一个数就是最小的数,这样的话我们可以不需要执行交换的代码,因此选择排序的算法我们可以做进一步的优化,优化代码如下(注释里面有解释):

	public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {101,34,119,1};
selectSort(arr);
} //选择排序
public static void selectSort(int[] arr){ //选择排序的算法
//通过上面的分步,我们可以知道,可以通过循环嵌套来实现
for(int i=0;i<arr.length-1;i++){ //i代表的就是实现该算法的次数。,具体的解释可以看上述代码
int min = arr[i];
int minIndex = i;
for(int j=i+1;j<arr.length;j++){ //j=i+1这个地方就是代表了,j应该从i+1个位置开始算起,因为之前的已经排好序
if(min>arr[j]){
min = arr[j];
minIndex = j;
}
}
if(minIndex != i){ //我们通过比较minIndex与i的值来确定是否 最小值发生了改变,如果没有改变,我们不需要执行下面的代码。
arr[minIndex] = arr[i];
arr[i] = min;
System.out.println("第"+(i+1)+"趟排序的结果:");
System.out.println(Arrays.toString(arr));
} } }

  最终得到的结果如下:

最新文章

  1. 解决国内npm依赖包安装慢的问题
  2. attrs 中的 uid
  3. SOA面向服务架构简述
  4. linux根目录详解
  5. CentOS 安装 Tomcat
  6. SCALA常规练习C
  7. Activity启动机制
  8. 转:用 git 下载 uboot 源码
  9. Gradle 教程:第一部分,安装【翻译】(转)
  10. 打开一个activity,让edittext不获得焦点
  11. zf-关于即将过期提示字符串的修改
  12. 开心的金明 NOIP 2006 普及组
  13. 使用git bash提交代码到github托管
  14. 使用echarts水球图
  15. JavaScript splice() 、slice() 方法
  16. 末学者笔记--NTP服务和DNS服务
  17. 重命名文件夹提示&quot;找不到指定文件&quot;
  18. 分布式-JOB(XXL-Job)
  19. H5离线缓存技术
  20. 爬虫的基本操作 requests / BeautifulSoup 的使用

热门文章

  1. shiro三连斩之概念
  2. 洛谷 P1801 黑匣子 题解
  3. 初识MySQL &lt;一&gt;
  4. [WPF]BringIntoView
  5. vim最常用命令
  6. 深入理解JVM-垃圾回收器
  7. tomcat同个端口配置多个项目后无后缀的页面跳转
  8. 如何修改Git已提交的日志
  9. 为什么 Android 开发者都应该尝试一下 Anko?
  10. spring AspectJ的Execution表达式(转载)