zoukankan      html  css  js  c++  java
  • JavaSE学习(六):随机数—简单的排序算法

     

    第一节:随机数

    1.1 Math.random()函数

      Math.random随机生成0~1间的随机点数,前包括(0.00)后不包括(1)

    一般没有实际意义,需要转为整数。

    例程:生成30-50随机数

    int t = Math.random*20+30;

    1.2 Random类:

    语法:Random r = new Random();

    常用的方法:

    nextInt();//随机生成int类型取值范围内的整数,对我们来说意义不大。

    nextInt(参数);随机生成指定范围内的整数(常用)

    例: nextInt(100);随机生成0~100之间的整数

    练习:

    结合数组和随机数完成双色球生成

    需求: 红球 1~33(包含) 号码中随机生成6个不重复的号码添加到球的数组中去蓝球 1~16(包含)号码中随机生成1个号码,扩容到红球数组中去

    分析:  球的数组 int[] bool=new int[6]

    第一个球: 随机生成一个号添加到数组中去后面生成的每一个球,都需要和前面每个球进行比较,只有不重复的情况下才能添加到数组中去,如果重复,舍弃,重新生成再比较,直到6个球全部添加到数组中去时完成红球功能。蓝球通过扩容添加到bool数组中去即可;

    例程:DoubleColerBall.java

     1 package random;
     2 
     3 import java.util.Arrays;
     4 import java.util.Random;
     5 
     6 public class DoubleColerball {
     7     
     8     public static void main(String[] args) {
     9         
    10         Random r = new Random();
    11         
    12         int[] redBall =new int[6];
    13         int index = 0;
    14         
    15         redBall[index++] = r.nextInt(33)+1;            //生成第一个数
    16 
    17         loop:        while(true) {
    18             
    19             int x = r.nextInt(33)+1;
    20             
    21             //判断生成的x,是否在数组中
    22             for (int j=0;  j<index;  j++) {
    23                 //如果x在数组里面则跳出循环到loop处重新生成x,再判断,直到x不是之前数组内的数
    24                 if(redBall[j] == x) {                                 
    25                      //到loop处循环
    26                     continue loop;                                  
    27                     
    28                 }
    29                 
    30             }        //while
    31             //将x填入数组,递加index
    32             redBall[index++] = x;                             
    33             
    34             if (index==6) {
    35             
    36                 break;                
    37             }
    38             
    39         }   //while    
    40     
    41         System.out.println("红球生成的数为"+Arrays.toString(redBall));
    42         
    43         int blue = r.nextInt(16)+1;
    44         
    45         System.out.println("蓝球生成的数为"+blue);
    46 
    47         int[] ball = Arrays.copyOf(redBall, redBall.length+1);
    48         
    49         ball[ball.length-1] = blue;
    50         
    51         System.out.println("最终生成的数为"+Arrays.toString(ball));
    52         
    53         System.out.println("最终生成的数排序为"+Arrays.toString( sort (ball) )  );
    54 
    55         
    56     }
    57     
    58 }
    View Code

    二节 几种排序算法

    2.1 冒泡排序算法

    2.1.1原理实现

    将数列从小向大排序(或从大向小),将每个位置数与下个位置数比较若比后面的数大则交换位置,一轮下来能得到一个最大数,第二轮得到第二大的数......

    2.1.2实例分析

      例: [6,8,5,7,4]想要的最终结果是[4,5,6,7,8]

                      6  8  5  7  4

      第一轮第一次:  6  8  5  7  4

      第一轮第二次:  6  5  8  7  4

      第一轮第三次:  6  5  7  8  4

      第一轮第四次:  6  5  7  4  8

     

      第二轮第一次:  5  6  7  4  8

      第二轮第二次:  5  6  7  4  8

      第二轮第三次:  5  6  4  7  8

     

      第三轮第一次:  5  6  4  7  8

      第三轮第二次:  5  4  6  7  8

      

      第四轮第一次:  4  5  6  7  8

      规律:轮数每增加一次,比较的次数都会减少一次

     Demo2.java

     View Code

    2.2 选择排序法:

    2.2.1原理实现

    选择排序法:

    第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;

    第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。

    例:

    初始序列:{49 27 65 97 76 12 38}

    第1趟:12与49交换:12{27 65 97 76 49 38}

    第2趟:27不动 :12 27{65 97 76 49 38}

    第3趟:65与38交换:12 27 38{97 76 49 65}

    第4趟:97与49交换:12 27 38 49{76 97 65}

    第5趟:76与65交换:12 27 38 49 65{97 76}

    第6趟:97与76交换:12 27 38 49 65 76 97 完成

    分析:

    1.设定数组中第一个数为最小

    2.将其和数组后面的每一个数进行比较,如果有比其小的交换两者位置

    Demo2.java
     1 package random;
     2 
     3 import java.util.Arrays;
     4 /**
     5  * 
     6  * @项目名称:JavaSEDay07m
     7  * @模块功能:选择排序的实现
     8  * @模块版本:
     9  * @JDKVersions:JDK 8.0
    10  * @author:  Kanekiyi
    11  */
    12 public class Demo3 {
    13     
    14     public static void main(String [] args) {
    15         int[] arr={5,9,2,807,89,88};
    16         int temp=0;
    17         
    18         //外层循环依次假设数组中的每一个数为最小值
    19         for(int i=0; i<arr.length-1;i++) {
    20             int min = arr[i];
    21             int minIndex = i;
    22             
    23             for (int j=i+1; j<arr.length;j++) {        //从i的下一个开始比较
    24                 if(min>arr[j]) {
    25                      min = arr[j];
    26                      minIndex = j;
    27                 }
    28                 
    29             }
    30             //交换最小值
    31             temp = arr[i];
    32             arr[i]  = arr[minIndex];
    33             arr[minIndex] = temp;
    34             
    35         }
    36         System.out.println(Arrays.toString(arr));
    37 
    38     }
    39 }
    View Code

    2.3 插入排序法:

    2.3.1原理实现

    插入排序类似整理扑克牌,将每一张牌插到其他已经有序的牌中适当的位置。

    插入排序由N-1趟排序组成,对于P=1到N-1趟,插入排序保证从位置0到位置P上的元素为已排序状态。

    简单的说,就是插入排序总共需要排序N-1趟,从index为1开始,讲该位置上的元素与之前的元素比较,放入合适的位置,这样循环下来之后,即为有序数组。

    2.3.2实例分析

    Demo2.java

     1     //插入排序算法
     2     public static void insertSort() {
     3         int[] arr = {3,6,8,4,2,9};
     4         int[] arr2 = new int[arr.length];
     5         arr2[0] = arr[0];
     6         int temp=0;
     7 
     8         for(int i=1; i<arr.length; i++) {      //依次取出原数组插入到新数组中比较
     9             
    10             for(int j=1; j<arr.length;j++) {
    11                 for(int k =0; k<j+1;k++) {
    12                     
    13                     if(arr[i]>arr2[k]) {            //比较插入数与原数组中的数并交换位置
    14                         temp = arr2[k];
    15                         arr2[k] = arr[i];
    16                         arr[i] = temp;
    17                     }        
    18                 }        
    19             }        
    20             //arr2[i] = temp;
    21         }
    22         System.out.println(Arrays.toString(arr2));
    23     }
    View Code

      注:这种方法是个人在看完原理后在冒牌排序的基础上改的,较为繁琐,下面地址(参考一)的博客有更简单的方法

      参考

      (一)8种排序算法详解:https://www.cnblogs.com/0201zcr/p/4764427.html

      (二)13种排序算法详解http://www.cnblogs.com/whf-Staring/p/4801418.html

      综合练习:利用数组和数据结构,完成学生管理系统(SMS1.0)的开发:

      要求:1、创建学生数组,用于保存数据

         2、通过键盘输入数字选择功能,不同数字完成不同功能,要求对学生数字完成增删该查功能;

    代码:SMS.java
      1 package random;
      2 
      3 import java.util.Arrays;
      4 import java.util.Scanner;
      5 
      6 /**
      7  * 学生管理系统1.0版本
      8  * @author  Kanekiyi
      9  * 分析:1、while 循环
     10  *            2、Scannre
     11  *               3、if 分支
     12  *               4、数组 扩容 缩容 遍历
     13  *      String
     14  * */
     15 
     16 public class SMS {
     17     
     18     public static void main(String[] args) {
     19         System.out.println("欢迎使用学生管理系统1.0版本");
     20         
     21         String[] students = {"刘一","孙二","张三","李四"};
     22         
     23         Scanner sc = new Scanner(System.in);
     24         
     25         while(true) {
     26             System.out.println("1.添加学生 2.删除学生 3.修改学生 4.学生列表 5.查询学生 6.退出");
     27             System.out.println("请输入数字选择功能");
     28 
     29             int type = sc.nextInt();
     30             
     31             //1添加学生
     32             if (type ==1) {
     33                 System.out.println("请输入添加学生姓名");
     34                 String name = sc.next();
     35                 students = Arrays.copyOf(students,students.length+1);
     36                 students[students.length-1] = name;
     37                 System.out.println("添加成功");
     38             }
     39         
     40             //2、删除学生
     41             if (type ==2) {
     42                 boolean flag = false;
     43                 System.out.println("请输入需要删除学生的姓名");
     44                 String name = sc.next();
     45 
     46                 for(int i=0; i<students.length; i++) {
     47                     if(students[i].equals(name)) {
     48                         //最后一个数放在要删除的名字位置
     49                         students[i] = students[students.length-1];       
     50                         //缩减数组
     51                         students = Arrays.copyOf(students,students.length-1);                 
     52                         System.out.println("删除学生成功1");
     53                         flag = true;
     54                     }
     55                 }
     56                 
     57                 if(!flag) {
     58                     System.out.println("查无此人!");
     59                 }
     60                 
     61             }    
     62             
     63             //3、修改学生
     64             if (type ==3) {
     65                 /**
     66                  * equals 只是比较两个字符串字符是否相同,而不是比较两个字符串的地址值。
     67                  * 
     68                  * */
     69                 boolean flag = false;
     70                 System.out.println("请输入修改学生姓名");
     71                 String name = sc.next();
     72 
     73                 for (int i=0; i<students.length; i++) {
     74                     if(students[i].equals(name) ) {
     75                         System.out.println("请输入修改后学生姓名");
     76                         String resetName = sc.next();
     77                         flag = true;
     78                         students[i] = resetName;
     79                         System.out.println(" 修改成功!");
     80                     }
     81                     
     82                 }
     83                 
     84                 if (!flag) {
     85                     System.out.println("查无此人!");
     86                 }
     87                                 
     88             }
     89             
     90             //4、学生列表
     91             if (type ==4) {
     92                     System.out.println(Arrays.toString(students));
     93             }            
     94             
     95             //5、查询学生
     96             if (type ==5) {
     97                 System.out.println("请输入你要查询学生的名字");
     98                 String name = sc.next();
     99                 boolean flag = false;
    100                 for(int i=0; i<students.length; i++) {
    101                     if(students[i].equals(name)) {
    102                         System.out.println(students[i]);
    103                     }
    104                     
    105                 }
    106                 
    107                 if(!flag) {
    108                     System.out.println("查无此人!");
    109                 }
    110                 
    111             }
    112             
    113             //6、退出
    114             if (type ==6) {
    115                 System.out.println("欢迎再次使用学生管理系统!"); 
    116                 break;
    117             }
    118     
    119         }//while
    120         
    121     }
    122 
    123 }
    View Code
  • 相关阅读:
    乘法九九表
    #include <time.h>
    【bzoj2060】[Usaco2010 Nov]Visiting Cows拜访奶牛 树形dp
    【codevs1380】没有上司的舞会 树形dp
    【bzoj1060】[ZJOI2007]时态同步 树形dp
    【bzoj2435】[NOI2011]道路修建 树形dp
    【bzoj3573】[HNOI2014]米特运输 树形dp
    【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心
    【codevs1163】访问艺术馆 树形dp
    【bzoj1864】[ZJOI2006]三色二叉树 树形dp
  • 原文地址:https://www.cnblogs.com/Kanekiyi/p/9501727.html
Copyright © 2011-2022 走看看