数组排序 和 二分法查找

二分法查找

当数据量很大适宜采用该方法。采用二分法查找时,数据需是有序不重复的。 基本思想:假设数据是按升序排序的,对于给定值 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;
   }
}

时间: 2025-01-30 18:07:57

数组排序 和 二分法查找的相关文章

java的二分法查找数据

Java二分法查找的源代码:    二分查找是一种高效率线性表的查找算法.在查找时必须将线性表中的关键词排好序.基本思路是:先断定线性表的中心方位 mid=(first+last)/2:对比所要查找的关键词 key与中心方位的关键词的巨细,假如比key和mid.key持平则回来: key比mid.key大(假定为升序)这所要查找的关键词在mid和last之间:否则在first与mid之间.持续按照上面办法查找中心元素,直到找到为止.    详细完成如下package com.cgogo; /**

JavaScript用二分法查找数据等

//二分法查数据 var arr=[41,43,45,53,44,95,23]; var b=44; var min=0; var max=arr.length; for(var i=1;i<arr.length;i++){ //外层循环控制排序的次数 for(var j=0;j<arr.length-i;j++){//内层循环控制循环的个数 if(arr[j]<arr[j+1]){ z=arr[j]; arr[j]=arr[j+1]; arr[j+1]=z; } } } // aler

python 实现二分法查找

二分查找图 二叉树: 代码 #!/usr/bin/python #-*-coding:utf-8-*- #---------------------------------------------------------------------------------------- # to_do : binary find # authors: zuoxingyu # time : 2014-06-07 #--------------------------------------------

python的算法:二分法查找(1)

1.什么是二分法查找: 1.从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: 2.如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较. 3.如果在某一步骤数组为空,则代表找不到. 每次都是i减半查找,其时间消耗为O(logn) 最简单的一个循环算法就是: def binary_search_loop(lst,value): low,high=0,len(value)-1 while low<=high: mid=

在数组中使用二分法查找

package com.db2; import java.util.Arrays; /** * 二分法查找 * * @author denny 使用二分法查找的前提数组已经排过序 * */ public class Demo4 { public static void main(String[] args) { int[] arr = { 3, 1, 8, 2, 9, 100, 33, 22, 11, 18, 14, 17, 15, 3 }; // 使用Arrays.sort()排序 Array

Java二分法查找实现

public class Dichotomy {        //定义查找次数    static int count = 0;        public static void main(String[] args) {                //定义数组        int [] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};                //二分法查找        int result = searchRecursive

用二分法查找的套路(一)

需要注意的是: 1.二分法查找是在有序的基础上 2.确定判断是否找到的条件,确定判断函数 3.边界条件控制 1)闭区间[a,b] 2)半开半闭区间[a,b) 例题: 1.首个失败的产品. 这是一个闭区间的例子. 假设有一系列产品[1,2,3,4,5,6,7...],现在发现最新的产品是损坏的,你需要找出第一个失败了的产品,也就是出问题的那个产品.是否出问题通过函数isBadVersion(version)来判断. 分析: 1 int left =1; 2 int right =n;//n是数组长

二分法查找元素位置

普通二分法查找元素: #include <stdio.h> #include <stdlib.h> int BinarySearch(int* a, int n, int pos) { int left = 0; int right = n-1; while (left <= right) { int mid = left+(right-left)/2; if(pos == a[mid]) { return mid; } else if(pos < a[mid]) {

php常见的几种排序以及二分法查找

<?php 1.插入排序 思想: 每次将一个待排序的数据元素插入到前面已经排好序的数列中,使数列依然有序,知道待排序数据元素全部插入完为止. 示例: [初始关键字] [49] 38 65 97 76 13 27 49J=2(38) [38 49] 65 97 76 13 27 49J=3(65) [38 49 65] 97 76 13 27 49J=4(97) [38 49 65 97] 76 13 27 49J=5(76) [38 49 65 76 97] 13 27 49J=6(13) [1