zoukankan      html  css  js  c++  java
  • 简单选择排序

    简单选择排序

    一、算法介绍

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

    二、算法流程

      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]).

      

  • 相关阅读:
    单例模式
    maven版本对应的jdk
    DateUtil
    多级反向代理java获取真实IP地址
    springcloud初次zuul超时报错com.netflix.zuul.exception.ZuulException:Forwarding error
    spring cloud-config的client中/refresh的端点报错401
    spring Cloud-eureka的保护模式
    spring cloud的配置
    spring boot部署中executable的系统服务
    登陆SQL Server 2000数据库提示超时已过期的解决方法
  • 原文地址:https://www.cnblogs.com/dazuihou/p/3641797.html
Copyright © 2011-2022 走看看