简单选择排序

简单选择排序

一、算法介绍

  简单选择排序属于选择类排序,主要动作就是“选择”,简单选择排序采用最简单的选择方式,从头至尾顺序扫描序列,找出最小的一个元素,和第一个元素交换,接着从剩下的元素中继续这种选择和交换,最终使序列有序。

二、算法流程

  1.从先从原始数组的第一个元素开始,依次和后面的元素比较,如果第一个元素大,就交换,这样就将最小元素换到下标为0的位置上。

  2.接着从第二个元素开始,依次和后面的元素比较,再将最小的元素换到下标为1的位置上。

  3.以此类推,直到倒数第二个元素和最后一个元素比较完。

  示意图如下:

  

  可以推测出,简单选择排序在对N个数据进行排序时,无论原数据是否有序,都要进行N-1步的中间排序。

三、核心代码

1 for(int i=0;i<arr.length-1;i++){ //对N个元素排序,要进行N-1步的中间排序,这一点和冒泡排序一样,所以也是i<arr.length
2     for(int j=i+1;j<arr.length;j++){ //每一次中间排序都是某一位置上的元素和下一个元素开始比较,所以是j=i+1;且每次都是直到比较到最后一个元素结束,即j<arr.length
3        if(arr[i]>arr[j]){ //交换操作
4           int temp=arr[i];
5           arr[i]=arr[j];
6           arr[j]=temp;
7         }
8    }
9 }

四、测试代码

 1 public class SimpleSelectSortDemo{
 2     public static void main(String args[]){
 3         int arr[]={49,38,65,97,76,13,1,-81,0,11};
 4         Sort d=new Sort();
 5         d.SimpleSelectSort(arr);}
 6         }
 7 class Sort{
 8     public void SimpleSelectSort(int[] arr){
 9         for(int i=0;i<arr.length-1;i++){
10             for(int j=i+1;j<arr.length;j++){
11                 if(arr[i]>arr[j]){
12                     int temp=arr[i];
13                     arr[i]=arr[j];
14                     arr[j]=temp;
15                 }
16             }
17         }
18         print(arr);
19         }
20 
21 
22     public void print(int[] arr){
23         for(int i=0;i<arr.length;i++){
24             System.out.print(arr[i]+" ");
25         }
26     }
27 }

 最后,我又浏览了一下之前写的冒泡排序http://www.cnblogs.com/dazuihou/p/3627237.html 对比了一下两个算法的异同以便于理解记忆,假设N个元素的数组arr:

  首先,冒泡排序和简单选择排序都是要进行N-1步的中间排序才能完成,所以外层循环是一样的,都是for(int i=0;i<arr.length-1;i++);

  其次,冒泡排序每一趟中间排序都是从数组第一个元素开始比较(所以初始化表达式j=0是固定的),每一趟比较的元素都会少一个(所以循环条件表达式为j<arr.length-1-i是随着趟数变动的),因为每一趟比较都会把最大的一个挑出来放到后面。所以内层循环(控制着每一趟的比较)的代码为for(int j=0;j<arr.length-1-i;j++);而简单选择排序每一趟中间排序分别是从第一个元素,第二个元素,第三个元素....直到倒数第二个元素开始与紧跟其后面的元素依次比较(所以初始化表达式j=i+1是随着趟数变动的),每一趟比较都会比较到数组的最后一个元素(所以循环表达式为j<arr.length是固定的),每一趟比较都会把最小的一个挑出来放到前面。所以内层循环的代码为for(int j=i+1;j<arr.length;j++);

    再次,冒泡排序每一趟比较并交换的是相邻的两个元素,所以为if(arr[j]>arr[j+1]),而简单选择排序每一趟比较并交换的是某一位置上的元素(根据趟数而变化)跟其之后的元素依次比较,所以为if(arr[i]>arr[j]).

  

原文地址:https://www.cnblogs.com/dazuihou/p/3641797.html