• 数组排序 和 二分法查找


    二分法查找

    当数据量很大适宜采用该方法。采用二分法查找时,数据需是有序不重复的。 基本思想:假设数据是按升序排序的,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功;若 x 小于当前位置值,则在数列的前半段中查找;若 x 大于当前位置值则在数列的后半段中继续查找,直到找到为止。

    假设有一个数组 {5,4,2, 67, 77, 89, 90,4,9,1,12, 23, 34, 45, 56 },现要求采用二分法找出指定的数值并将其在数组的索引返回,如果没有找到则返回 -1

    首先要做到的就是给数组进行排序

    一般有四种方法:快速排序法、冒泡法、选择排序法、插入排序法。

    快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现。

    冒泡法是运用遍历数组进行比较,通过不断的比较将最小值或者最大值一个一个的遍历出来。

    选择排序法是将数组的第一个数据作为最大或者最小的值,然后通过比较循环,输出有序的数组。

    插入排序是选择一个数组中的数据,通过不断的插入比较最后进行排序。下面我就将他们的实现方法一一详解供大家参考。

    利用Arrays带有的排序方法快速排序

    Arrays.sort()方法根据传出参数的长度的大小来判断用哪种排序方法,如果数组的长度小于7用冒泡排序,如果数组长度大于7,将数组分为两部分,前半部分和后半部分分别进行冒泡排序,最后再执行一次总的排序
    复制代码
    import java.util.Arrays; 
    public class Test2{   
        public static void main(String[] args){   
            int[] a={5,4,2,4,9,1};   
            Arrays.sort(a);  //进行排序   
            for(int i: a){   
                System.out.print(i);   
           }  
        }  
    }
    复制代码
    
    

    冒泡排序算法

    原理:从数组的第一个位置开始两两比较array[index]和array[index+1],如果array[index]大于array[index+1]则交换array[index]和array[index+1]的位置,止到数组结束;

                             从数组的第一个位置开始,重复上面的动作,止到数组长度减一个位置结束;

                             从数组的第一个位置开始,重复上面的动作,止到数组长度减二个位置结束;

    。。。。

    复制代码
    public static int[] bubbleSort(int[] args){//冒泡排序算法   
        for(int i=0;i<args.length-1;i++){   
           for(int j=i+1;j<args.length;j++){   
               if (args[i]>args[j]){   
                   int temp=args[i];   
                   args[i]=args[j];   
                   args[j]=temp;   
                   }   
        }  
       }  
       return args;  
    }
    复制代码

    选择排序算法:

    原理:选择一个值array[0]作为标杆,然后循环找到除这个值外最小的值(查找小于标杆的最小值),交换这两个值,这时最小值就被放到了array[0]上,然后再将array[1]作为标杆,从剩下未排序的值中找到最小值,并交换这两个值。

    冒泡排序是每一次都可能要交换 而选择排序是在比较时记下a[i]的位置 最后来交换 所以他们的交换过程是不一样的 而查找的过程是一样的,效率不会比冒泡的低...

    复制代码
    public static int[] selectSort(int[] args){//选择排序算法   
         for (int i=0;i<args.length-1 ;i++ ){   
                int min=i;   
                for (int j=i+1;j<args.length ;j++ ){   
                  if (args[min]>args[j]){   
                       min=j;   
                     }   
                }   
              if (min!=i){  
              int temp=args[i];  
              args[i]=args[min];  
              args[min]=temp;          
              }  
            }  
             return args;  
    } 
    复制代码

    插入排序算法

    原理:插入排序的思想是数组是部分有序的,然后将无序的部分循环插入到已有序的序列中

    复制代码
    public static int[] insertSort(int[] args){//插入排序算法   
         for(int i=1;i<args.length;i++){   
             for(int j=i;j>0;j--){   
                if(args[j]<args[j-1]){   
                    int temp=args[j-1];  
                    args[j-1]=args[j];  
                    args[j]=temp;          
                }else break;   
            }  
         }  
         return args;  
    } 
    复制代码

    ===================================================================================================

    =================================================================================================

    在排序完成之后再使用二分法

    复制代码
    public class DichotomySearch {
       public static void main(String[] args) {
           int[] arr = new int[] { 12, 23, 34, 45, 56, 67, 77, 89, 90 };
           System.out.println(search(arr, 12));
           System.out.println(search(arr, 45));
           System.out.println(search(arr, 67));
           System.out.println(search(arr, 89));
           System.out.println(search(arr, 99));
       }
    
       public static int search(int[] arr, int key) {
           int start = 0;
           int end = arr.length - 1;
           while (start <= end) {
               int middle = (start + end) / 2;
               if (key < arr[middle]) {
                   end = middle - 1;
               } else if (key > arr[middle]) {
                   start = middle + 1;
               } else {
                   return middle;
               }
           }
           return -1;
       }
    }
    复制代码
  • 相关阅读:
    ios专题 - OCUnit
    ios专题 - APP设计流程
    ios专题 - openSSL
    iOS开发获取缓存文件的大小并清除缓存
    支付宝“订单交易失败 ALI64” 报错的原因
    先登录 在跳转到tabBar
    首页 导航栏隐藏 下一级页面显示,pop回来遇到的问题
    invalid nib registered for identifier (重用符)
    iOS开发集成微信支付
    NSdata 与 NSString,Byte数组,UIImage 的相互转换
  • 原文地址:https://www.cnblogs.com/jikexianfeng/p/5840522.html
Copyright © 2020-2023  润新知