美文网首页
6.数组反转,数组排序 (冒泡,二分查找,查重数组)

6.数组反转,数组排序 (冒泡,二分查找,查重数组)

作者: 压缩干粮 | 来源:发表于2021-08-11 22:49 被阅读0次

1.冒泡排序

  • 冒第一个泡,写一个循环,让数组中的最大值出现在数组的最后一个位置
    冒第二个泡,写一个循环,让数组中的第二大值出现在数组的最倒数第二个位置
    ...
    两两对比,大值放在后面!5个数数据,冒最大的泡,需要对比多少次?4次,所以循环4次就可以出结果了
 public class demo1 {
    public static void main(String[] args) {
         int[] arr = {99,8,3,87,12};
        // 外层循环用来控制需要循环多少次
        //最后一个不用动,所以只需要循环数组长度减1次  就可以完成
        //内层循环用来操作一个一个的交换位置(俗称冒泡)
         for(int i = 0;i<arr.length-1;i++){  
            
             // 99先和3对比,99大,所以代替3的位置,继续和8对比,他只需要对比arr.length-1次
              //(写0是为了看出规律)
             //  用循环的话就是
             // for(int j=0;j<arr.length-1-0;j++){
             //    if(arr[j]>arr[j+1]){
             //       int temp = arr[j]   用临时变量,交换他俩位置
             //       arr[j] = arr[j+1]
             //         arr[j+1] = temp
             //    }
             // }  结果是  {8,3,87,12,10,56,65,99};
             
             //再来一次   8先和3对比,8大,所以代替3的位置,继续和87对比,
            //但是不需要对比最后一个,因为已经对比过了上一轮,所以就是去掉数组的最 
             //后一位arr.length-1-1
             //  用循环的话就是
             // for(int j=0;j<arr.length-1-1;j++){
             //    if(arr[j]>arr[j+1]){
             //       int temp = arr[j]   用临时变量,交换他俩位置
             //       arr[j] = arr[j+1]
             //         arr[j+1] = temp
             //    }
             // }
            // 所以  外面的循环控制需要几次,里面的进行一个一个的对比。
             
             for(int j= 0;j<arr.length-1-i;j++){
                 if(arr[j]>arr[j+1]){
                     int temp = arr[j];
                     arr[j] = arr[j+1];
                     arr[j+1] = temp;
                 }
             }
         }
 ///  最后结果的打印:
         for (int i= 0;i<arr.length;i++){
             System.out.println(arr[i]);
         }
    }
}

2. 数组查找 -- 二分查找

  • 对数组有个要求,必须是有序的。
public class erfen {
    public static void main(String[] args) {
         int[] arr = {1,3,5,7,8,9,10};
         int num = 10;
         int left = 0;
         int right = arr.length-1;
         int mid = (left+right)/2;  //先从中间开始猜
         int index = -1;
         while(left<=right){ //循环多少次不知道,猜的区间一直在缩小,不能让左边比右边还大
             if(num == arr[mid]){  // 如果正好,num == arr[mid]  直接结束循环;
                 index = mid;
                 break;
             }
             if(num>arr[mid]){
                 left = mid+1; //直接从中间往上猜
             }
             if(num<arr[mid]){
                 right = mid-1;  // 直接从中间往下猜
             }
            mid = (left+right)/2;   // 重新计算下,从新的区间的中间开始猜。
         }
        System.out.println(index);


    }
}

3.简单选择排序

  • 思想
  • 找到数组中的最大值,放在最后一个位置
  • 找到数组中第二大的值,放在倒数第二个位置
public  class jdxz{
    public static void main(String[] args){
        int[] arr = {4,3,67,23,5,99};
        //  想让这个值为数组第一项

        //    第一步  :先找到最大值  int max = 67;   int index = 2;  把他放到最后。
        // 所以循环就可以从第一位开始对比了
        // (就是max 先和index =1的对比,一直到最后,谁大,就把它赋值给max)。
//        for(int i = 1;i<arr.length-1;i++){
//            if(arr[i]>max){
//                index = i;
//                max = arr[i];
//            }
//        }
        // 如果index 正好是最后一位,就没必要交换了
//        if(index!=arr.length-1){
//            int temp = arr[index];
//            arr[index] = arr[arr.length-1];
//            arr[arr.length-1] = temp;
//        }
       for (int j=0; j<arr.length-1;j++){
           int max = arr[0];
           int index = 0;
           for(int i = 1;i<arr.length-j;i++){
               if(arr[i]>max){
                   index = i;
                   max = arr[i];
               }
           }
           // 如果index 正好是最后一位,就没必要交换了
           if(index!=arr.length-1-j){
               int temp = arr[index];
               arr[index] = arr[arr.length-1-j];
               arr[arr.length-1-j] = temp;
           }

       }
        for (int i=0;i<arr.length;i++){
            System.out.println(arr[i]);
        }
    }
}

4.数组里重复的有几个

public class Test1 {
    public static void main(String[] args) {
        //这个题目是有难度的,日测已经简单很多天了!拔高的题目
        char[] arrs={'a','c','a','a','b'};
        char[] arrs1=new char[arrs.length];
        int[] nums=new int[arrs.length];
        int count=0;//记录字符的种类数据
        for(int i=0;i<arrs.length;i++){
            //1. 取到arrs中的一个字符(从数组中取出来的一个字符)
            char c=arrs[i];
            //2. 去arrs1中进行判断,是否存在的判断
            int index=-1;
            for(int j=0;j<count;j++){
                if(c==arrs1[j]){
                    //如果进入到if说明找到相同的了,说明之前添加过该字符
                    index=j;
                }
            }
            //3. 根据index的值判断之前是否出现过该字符(c)
            if(index==-1){
                //说明该字符就是第一次出现
                arrs1[count]=c;
                nums[count]=1;
                count++;
            }else{
                //说明该字符不是第一次出现
                nums[index]=nums[index]+1;
            }
        }

        //查看结果
        for (int i = 0; i < count; i++) {
            System.out.println(arrs1[i]+"-----"+nums[i]);

相关文章

  • 6.数组反转,数组排序 (冒泡,二分查找,查重数组)

    1.冒泡排序 冒第一个泡,写一个循环,让数组中的最大值出现在数组的最后一个位置冒第二个泡,写一个循环,让数组中的第...

  • 常见简单算法

    1.数组 二分查找: 冒泡排序 插入排序 选择排序 快速排序 链表 链表反转 合并2个有序链表 树 前序遍历

  • PHP的常用算法

    1、冒泡排序 2、快速排序 3、二分查找 假设数组是升序排列。

  • 二分法查找

    二分法查找的前提是数组必须排序!!!二分法查找的前提是数组必须排序!!!二分法查找的前提是数组必须排序!!!二分法...

  • 算法复习

    1、冒泡排序 2、二分查找 3、判断回文: 解法一(切片)、 解法二(双指针) 4、基于排列构建数组 5、数组串联...

  • Java语言——数组排序算法

    数组有很多常用的算法,包括冒泡排序、直接选择排序和反转排序。 一、冒泡排序 冒泡排序是最常用的数组排序算法之一,它...

  • 冒泡,选择,插入排序以及二分查找

    冒泡排序 选择排序 优化选择排序 插入排序 排序案例 二分法查找 二分法查找的前提是数组必须是有序的; 二分查找案...

  • 数组排序去重

    冒泡排序 sort排序 数组去重

  • DAY. 05 冒泡排序,选择排序,杨辉三角

    学了一维数组的3种定义格式,数组的内存,遍历数组,数组的排序冒泡排序和选择排序,数组元素的查找,复制。 以及二维数...

  • 一维数组

    一维数组通常用于数组的查找和排序 排序 1:倒序输出 2:升序or降序排列冒泡排序法 查找

网友评论

      本文标题:6.数组反转,数组排序 (冒泡,二分查找,查重数组)

      本文链接:https://www.haomeiwen.com/subject/zaghbltx.html