1 package lsg.ap.select;

 import java.util.Random;

 public class SelectSort
 {
     //选择排序
     /**
      *@author: 梁山广
      * 2016年4月11日上午10:04:13
      * @param a:需要尽行排序的数组
      */
     //选择排序
     /*
      *  选择排序和冒泡排序差不多,只是冒泡排序在发现比它小的时候就交换,而选择排序是只
      *  有在确定了最小的数据之后,才会发生交换。选择排序的基本思想:第i趟简单选择排序
      *  是指通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个
      *  记录进行交换。先临时记录其位置,只有在一趟循环完以后确定了最小的数据,才会发生交换。
      *  问题:为什么最小值记录要用下标而不能直接用数组元素?
      *  答:会导致数据覆盖后丢失
      */
     public static void selectSort(int [] a)
     {
         int n = a.length;
         for(int i=0; i<n-1; i++)
         {
             int min = i;
             for(int j=i+1; j<n; j++)
             {
                 if(a[j] < a[min])
                 {
                     min = j;
                 }
             }
             if(i != min)//当当前位置已经为本轮最小元素时,直接不用交换即可
             {
                 int temp = a[i];
                 a[i] = a[min];
                 a[min] = temp;
             }
         }  

     }
     public static void selectSort2(int [] a)
     {
         int n = a.length;
         for(int i=0; i<n-1; i++)
         {
             int min = a[i];
             for(int j=i+1; j<n; j++)
             {
                 if(a[j] < min)
                 {
                     min = a[j];
                 }
             }
             if(a[i]!= min)//这个本质是为了把最小的元素交换到最前面,
                           //但是实际上当a[i]!=min时会导致a[i]数据的丢失
                          //,出现了重复的元素,因此只能用下标来指示min
                         //但是插入排序的话,两种方法都可以
             {
                 int temp = a[i];
                 a[i] = min;
                 a[min] = temp;
             }
         }  

     }
     /**
      *
      * 输出相应数组的结果
      * @param array
      */
     private static void printArray(int[] array)
     {
        for(int value:array)
        {
            System.out.print(" "+value+" ");

        }
        System.out.println();
     }
     public static void main(String[] args)
     {
         //小数据量的测试
         int[] array=new int[]{8,3,2,1,7,4,6,5};
         //下面是大数据量的测试。这样才能看出不同算法的优劣
         Random random=new Random();
         int[] array2=new int[2000];
         for(int j=0;j<2000;j++)
         {
             array2[j]=random.nextInt(100000);
         }
          System.out.println("排序前数组元素为:");
          printArray(array);
          long dateStart=System.nanoTime();
          selectSort(array);
          long dateEnd=  System.nanoTime();
          long totalTime=dateEnd-dateStart;
          System.out.println("选择排序的时间复杂度为:");
          System.out.println(totalTime+"纳秒");
          System.out.println("排序后数组元素为:");
          printArray(array);
     }

 }

Java基础(46):选择排序的Java封装(完整可运行)的更多相关文章

  1. 【java基础】选择排序and冒泡排序

    前言 : 今天学习的是J2SE视频里的第五章,数组部分,它里面留了一个经典的作业,就是让我们去从1倒9按一定规格排序,这让我想起了学习vb的时候最最让我头疼的两种排序方法,选择排序法 和 冒泡排序法. ...

  2. 【Java基础】选择排序、冒泡法排序、二分法查找

    1.选择排序: //改进后的选择排序,减少交换的次数 public static void sortSelect(int arr[]) { //用于存放最小数的下标 int s; for (int i ...

  3. Java基础-数组常见排序方式

    Java基础-数组常见排序方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数据的排序一般都是生序排序,即元素从小到大排列.常见的有两种排序方式:选择排序和冒泡排序.选择排序的特 ...

  4. 选择排序之Java实现

    选择排序之Java实现 一.方法一 package cn.com.zfc.lesson21.sort; /** * * @title SelectSort * @describe 选择排序 * @au ...

  5. Java数组直接选择排序、sort()排序

    /** * 1.数组sort()排序 * 2.直接选择排序(两重for循环排序) */ import java.lang.*; import java.lang.reflect.Array; impo ...

  6. 选择排序-Python & Java

    选择排序:1.找出最小的数值放在第一位2.找出剩余数据中最小的数值放在第二位,以此类推,直到最后一个数值 算法的时间复杂度为:O(n) ''' 选择排序: 1.找出最小的数值放在第一位 2.找出剩余数 ...

  7. 经典排序算法之-----选择排序(Java实现)

    其他的经典排序算法链接地址:https://blog.csdn.net/weixin_43304253/article/details/121209905 选择排序思想: 思路: 1.从整个数据中挑选 ...

  8. Java基础:三步学会Java Socket编程

    Java基础:三步学会Java Socket编程 http://tech.163.com 2006-04-10 09:17:18 来源: java-cn 网友评论11 条 论坛        第一步 ...

  9. 【Java SE】如何用Java实现直接选择排序

    摘要:直接选择排序属于选择排序的一种,但是它的排序算法比冒泡排序的速度要快一些,由于它的算法比较简单,所以也比较适合初学者学习掌握. 适宜人群:有一定Java SE基础,明白Java的数据类型,数组的 ...

随机推荐

  1. Bluetooth ATT介绍

    目录 1 介绍 2 详细内容 2.1 Attribute Type 2.2 Attribute Handle 2.3 Attribute Handle Grouping 2.4 Attribute V ...

  2. Oozie协作框架

    一:概述 1.大数据协作框架 2.Hadoop的任务调度 3.Oozie的三大功能 Oozie Workflow jobs Oozie Coordinator jobs Oozie Bundle 4. ...

  3. JQuery通过$(xxx...)返回对象

    var JQ = function () { return new JQ.prototype.init(); }; JQ.prototype.init = function () { }; JQ.pr ...

  4. Linux 有问必答:如何知道进程运行在哪个 CPU 内核上?

    问题:我有个 Linux 进程运行在多核处理器系统上.怎样才能找出哪个 CPU 内核正在运行该进程? 当你在 多核 NUMA 处理器上运 行需要较高性能的 HPC(高性能计算)程序或非常消耗网络资源的 ...

  5. Ant学习-001-ant 基础知识及windows环境配置

    一.Ant 概要基础知识 Apache Ant 是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发,用以构建应用,或结合其他开源测试工具例如 git.T ...

  6. centos linux

    centos 自带apache(httpd)不用安装 1.查看linux 版本号 方法1: cat /etc/redhat-release /etc/redhat-release配置文件用一行内容来声 ...

  7. 开始了ecshop

    一个多星期前开始接触ecshop,突然决定要用它来做网站,于是从网上找各种手册与视频,联系官网客服,然后知道官网一共提供三种类型的服务,一种是ecshop授权,不包含任何技术支持,第二种是易开店的标准 ...

  8. 微信小店分类ID列表

    一级分类 { , "errmsg": "ok", "cate_list": [ { ", "name": &q ...

  9. php 使用 Memcache 例子

    代码写成后不断的往数据库插入数据,可以发现 当set时:理论上速度变慢,但数据同步 当get时:理论上速度变快,但数据不同步,需要缓存失效后重新请求set方法 <?php $mem = new ...

  10. C# 读取app.config配置文件节点键值,提示"配置系统未能初始化" 错误的解决方案

    MSDN里写到, 如果配置文件中包含 configSections 元素,则 configSections 元素必须是 configuration 元素的第一个子元素. 将自己添加的appSettin ...