Java学习笔记 7 - ASCII编码表、冒泡,选择排序、折半查找案例分析

01 ASCII编码表

数字0-9对应ASCII编码十进制为48-57
字母a-z对应ASCII编码十进制为97-122
字母A-Z对应ASCII编码十进制为65-90


image.png
02 数组逆序

数组的逆序:数组中最远的两个索引,进行位置交换,实现数组的逆序
实现代码:


image.png
        public class ArrayMethodTest_1{
        public static void main(String[] args){
            int[] arr = {3,5,7,1,0,9,-2};
            //调用数组的逆序方法
            reverse(arr);
            //看到数组的元素,遍历
            printArray(arr);
        }
        /*
           定义方法,实现数组的逆序
           返回值: 没有返回值
           参数:   数组就是参数
        */
        public static void reverse(int[] arr){
            //利用循环,实现数组遍历,遍历过程中,最远端换位
            //for的第一项,定义2个变量, 最后,两个变量++ --
            for( int min = 0 , max = arr.length-1 ; min < max  ; min++,max--){
                //对数组中的元素,进行位置交换
                //min索引和max索引的元素交换
                //定义变量,保存min索引
                int temp = arr[min];
                //max索引上的元素,赋值给min索引
                arr[min] =  arr[max];
                //临时变量,保存的数据,赋值到max索引上
                arr[max] = temp;
            }
        }
    }
03 选择排序

a、选择排序原理


image.png
  • 通过观察发现,本题目要实现把数组元素{13,46,22,65,3}进行排序
  • 提到数组排序,就要进行元素值大小的比较,通过上图发现,我们想完成排序要经过若干次的比较才能够完成。
  • 上图中用每圈要比较的第一个元素与该元素后面的数组元素依次比较到数组的最后一个元素,把小的值放在第一个数组元素中,数组循环一圈后,则把最小元素值互换到了第一个元素中。
  • 数组再循环一圈后,把第二小的元素值互换到了第二个元素中。按照这种方式,数组循环多圈以后,就完成了数组元素的排序。这种排序方式我们称为选择排序。

b、 解题步骤

  • 使用for循环(外层循环),指定数组要循环的圈数(通过图解可知,数组循环的圈数为数组长度 - 1)

  • 在每一圈中,通过for循环(内层循环)完成数组要比较的第一个元素与该元素后面的数组元素依次比较到数组的最后一个元素,把小的值放在第一个数组元素中

  • 在每一圈中,要参与比较的第一个元素由第几圈循环来决定。如上图所示

  • 进行第一圈元素比较时,要比较的第一个元素为数组第一个元素,即索引为0的元素

  • 进行第二圈元素比较时,要比较的第一个元素为数组第二个元素,即索引为1的元素

  • 依次类推,得出结论:进行第n圈元素比较时,要比较的第一个元素为数组第n个元素,即数组索引为n-1的元素

          public class SelectSortTest{
          public static void main(String[] args){
              int[] arr  = {3,1,4,2,56,7,0};
              //调用选择排序方法
              //selectSort(arr);
              printArray(arr);
          }
          /*
              定义方法,实现数组的选择排序
              返回值: 没有
              参数:  数组
              实现步骤:
                1.嵌套循环实现排序
                  外循环,控制的是一共比较了多少次
                  内循环,控制的是每次比较了多少个元素
                2. 判断元素的大小值
                  小值,存储到小的索引
          */
          public static void selectSort(int[] arr){
              for(int i = 0 ; i < arr.length - 1; i++){
                  //内循环,是每次都在减少,修改变量的定义
                  for(int j = i+1 ; j < arr.length ; j++){
                      //数组的元素进行判断
                      if(arr[i] > arr[j]){
                          //数组的换位
                          int temp = arr[i];
                          arr[i] = arr[j];
                          arr[j] = temp; 
                      }
                  }
              }
          }
          /*
             定义方法,实现功能
             返回值: void
             方法参数: 数组
          */
          public static void printArray(int[] arr){
              //输出一半中括号,不要换行打印
              System.out.print("[");
              //数组进行遍历
              for(int i = 0 ; i < arr.length ; i++){
                  //判断遍历到的元素,是不是数组的最后一个元素
                  //如何判断 循环变量 到达 length-1
                  if( i == arr.length-1 ){
                      //输出数组的元素和]
                      System.out.print(arr[i]+"]");
                  }else{
                  //不是数组的最后一个元素,输出数组元素和逗号
                      System.out.print(arr[i]+",");
                  }
              }
              System.out.println();
          }
      }
    
04 冒泡排序

a、原理


image.png
  • 通过观察发现,本题目要实现把数组元素{13,46,22,65,3}进行排序

  • 提到数组排序,就要进行元素值大小的比较,通过上图发现,我们想完成排序要经过若干次的比较才能够完成。

  • 上图中相邻的元素值依次比较,把大的值放后面的元素中,数组循环一圈后,则把最大元素值互换到了最后一个元素中。
    *数组再循环一圈后,把第二大的元素值互换到了倒数第二个元素中。按照这种方式,数组循环多圈以后,就完成了数组元素的排序。这种排序方式我们称为冒泡排序。
    b、 解题步骤

  • 使用for循环(外层循环),指定数组要循环的圈数(通过图解可知,数组循环的圈数为数组长度 - 1)

  • 在每一圈中,通过for循环(内层循环)完成相邻的元素值依次比较,把大的值放后面的元素中

  • 每圈内层循环的次数,由第几圈循环来决定。如上图所示

  • 进行第一圈元素比较时,内层循环次数为数组长度 - 1

  • 进行第二圈元素比较时,内层循环次数为数组长度 - 2

  • 依次类推,得出结论:进行第n圈元素比较时,内层循环次数为数组长度 - n

              public class BubbleSortTest{
          public static void main(String[] args){
                      int[] arr  = {3,1,4,2,56,7,0};
                      //调用选择排序方法
                      //selectSort(arr);
                      
                      //调用冒泡排序方法
                      bubbleSort(arr);
                      printArray(arr);
              }
                  public static void bubbleSort(int[] arr){
                      for(int i = 0 ; i < arr.length - 1; i++){
                          //每次内循环的比较,从0索引开始, 每次都在递减
                          for(int j = 0 ; j < arr.length-i-1; j++){
                              //比较的索引,是j和j+1
                              if(arr[j] > arr[j+1]){
                                  int temp = arr[j];
                                  arr[j] = arr[j+1];
                                  arr[j+1] = temp;
                              }
                          }
                      }
                  }
                  
                  /*
                     定义方法,实现功能
                     返回值: void
                     方法参数: 数组
                  */
                  public static void printArray(int[] arr){
                      //输出一半中括号,不要换行打印
                      System.out.print("[");
                      //数组进行遍历
                      for(int i = 0 ; i < arr.length ; i++){
                          //判断遍历到的元素,是不是数组的最后一个元素
                          //如何判断 循环变量 到达 length-1
                          if( i == arr.length-1 ){
                              //输出数组的元素和]
                              System.out.print(arr[i]+"]");
                          }else{
                          //不是数组的最后一个元素,输出数组元素和逗号
                              System.out.print(arr[i]+",");
                          }
                      }
                      System.out.println();
                  }
              }
    
05 数组的折半查找

a、原理分析


image.png
  • 通过观察发现,本题目要实现查找指定数值在元素有序的数组中存储的位置(索引),返回该位置(索引)。
  • 最中间位置的元素值与要查找的指定数值进行比较,若不相等,则根据比较的结果,缩小查询范围为上次数组查询范围的一半;
    再根据新的查询范围,更新最中间元素位置,然后使用中间元素值与要查找的指定数值进行比较
    比较结果相等,返回中间元素值的索引
    比较结果不相等,继续缩小查询范围为上次数组查询范围的一半,更新最中间元素位置,继续比较,依次类推。
  • 当查询范围缩小到小于0个元素时,则指定数值没有查询到,返回索引值-1。

b、解题步骤

  • 定义3个用来记录索引值的变量,变量min记录当前范围最小索引值,初始值为0;变量max记录当前范围最大索引值,初始值为数组长度-1;变量mid记录当前当前范围最中间元素的索引值,初始值为(min+max) / 2

  • 使用循环,判断当前范围下,最中间元素值与指定查找的数值是否相等
    若相等,结束循环,返回当前范围最中间元素的索引值mid
    若不相等,根据比较结果,缩小查询范围为上一次查询范围的一般
    中间元素值 比 要查询的数值大,说明要查询的数值在当前范围的最小索引位置与中间索引位置之间,此时,更新查询范围为:
    范围最大索引值 = 上一次中间索引位置 -1;
    中间元素值 比 要查询的数值小,说明要查询的数值在当前范围的最大索引位置与中间索引位置之间,此时,更新查询范围为:
    范围最小索引值 = 上一次中间索引位置 +1;
    在新的查询范围中,更新中间元素值的位置,再次使用最中间元素值与指定查找的数值是否相等。
    中间索引值 = (范围最小索引值 +范围最大索引值) / 2;

  • 每次查询范围缩小一半后,使用if语句判断,查询范围是否小于0个元素,若小于0个元素,则说明指定数值没有查询到,返回索引值-1。

           public class BinarySearchTest{
           public static void main(String[] args){
               int[] arr = {1,3,5,7,9,11,15};
               int index = binarySearch(arr,10);
               System.out.println(index);
               
           }
           /*
               定义方法,实现,折半查找
               返回值: 索引
               参数: 数组,被找的元素 
               实现步骤:
                 1. 需要的变量定义
                    三个,三个指针
                    
                 2. 进行循环折半
                    可以折半的条件  min <= max
                 
                 3. 让被找元素,和中间索引元素进行比较
                     元素 > 中间索引  小指针= 中间+1
                     元素 < 中间索引  大指针= 中间-1
                     元素 == 中间索引  找到了,结束了,返回中间索引
                     
                  4. 循环结束,无法折半
                    元素没有找到 ,返回-1
           */
           public static int binarySearch(int[] arr, int key){
               //定义三个指针变量
               int min = 0 ;
               int max = arr.length -1 ;
               int mid = 0;
               //循环折半,条件 min<=max
               while( min <= max){
                   //公式,计算中间索引
                   mid = (min+max)/2;
                   //让被找元素,和中间索引元素进行比较
                   if(key > arr[mid]){
                       min = mid + 1;
                   }else if (key < arr[mid]){
                       max = mid - 1;
                   }else{
                       //找到元素,返回元素索引
                       return mid;
                   }
               }
               return -1;
           }
           
          /*
             定义方法,实现数组的普通查询
             返回值: 索引
             参数:   数组, 被找的元素
             
             实现步骤:
               1. 遍历数组
               2. 遍历过程中,使用元素和数组中的元素进行比较
                  如果相同,返回元素在数组中的索引
                  如果不同,返回负数
          */
          public static int search(int[] arr, int key){
              //遍历数组
              for(int i = 0 ; i < arr.length ; i++){
                  //数组元素,被查找的元素比较
                  if(arr[i] == key){
                      //返回索引
                      return i;
                  }
              }
              return -1;
          }
      }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容