有序数组和二分法

来源:互联网 发布:php数组循环 编辑:程序博客网 时间:2024/05/16 07:58

1 原理和步骤

     有序数组插入和删除操作中,由于所有靠后的数据都需要移动以腾开空间,所以速度较慢。在查找方面,无序数组是通过线性查找,而有序数组可以通过二分法进行快速查找,速度比无序数组快很多。

     二分法的时间复杂度为0(log n),具体步骤是先查看数组正中间的数据项,如果那个数据项比要找的大,就要缩小范围,在数组的前半段进行查找;反之则在后半段找。反复这个过程即可。

 

2 完整代码

public classArray {             /**        * 数组        */       private int[] array;        /**        * 数组有效长度        */       private int arraySize;              /**        * 初始化数组,无参构造函数        */       public Array() {              array = new int[101];       }        /**        * 指定数组的大小有参构造函数        */       public Array(int maxSize) {              array = new int[maxSize];       }        /**        * 添加数据        * @param value        */       public voidadd(int value){              int i;              for(i =0; i < arraySize;i++){     //找出合适位置                     if(array[i] > value){                            break;                     }              }              for(int j = arraySize; j> i; j-- ){      //位置大于i的元素往后移动一位                     array[j] = array[j - 1];              }              array[i] = value;                arraySize++; //有效数组增大       }             /**        * 线性查找        * @param item        */       public voidfind(int item) {              for(int i = 0 ; i < arraySize; i++){                     if(array[i] == item){                            System.out.println("查找的元素" + item + "所在位置为:" + i);                            return;                     }              }              System.out.println("元素" + item + "不存在!");       }        /**        * 二分查找法        * 针对有序数组        * @param item        */       public voidbinaryFind(int item){              int low = 0;  //起始位置              int high = arraySize -1;     //末尾位置              int counter = 0;              int curIn =0;                           while(low <= high){                     curIn = (low + high) / 2 ;  //平均值的位置                     System.out.println("二分法查找第" + ++counter + "次,此时(low + high) / 2的值为" + curIn + "high= " + high + " low= " + low);  //演示步骤                     if(item < array[curIn]){                            high = curIn - 1;                     } else if(item > array[curIn]){                            low = curIn + 1;                     } else{                            System.out.println("查找的元素" + item + "所在位置为:" + curIn);                            break;                     }              }       }             /**        * 根据索引查找数据        * @param index        * @return        */       public intget(int index){              if(index >= arraySize || index< 0){                     throw newArrayIndexOutOfBoundsException();              } else{                     return array[index];              }       }             /**        * 根据索引删除数据        * @param item        * @return        */       public voiddelete(int index) {              if(index >= arraySize || index< 0){                     throw newArrayIndexOutOfBoundsException();   //数组越界              } else{                     for(int i = index; i< arraySize; i++){                            array[i] = array[i + 1]; //从后向前移动一位                     }              }              arraySize--;   //数组长度缩小一位       }              /**        * 显示数据        */       public voiddisplay() {              StringBuilder str = new StringBuilder(); // 字符串拼接              str.append("[");              for (int i = 0; i < arraySize; i++) {                            str.append(array[i] + ",");              }              str.replace(str.length() - 2, str.length() - 1, "]"); // 不包含起始值              System.out.println(str.toString());       }        /**        * 测试        *        * @param args        */       public static void main(String[] args) {              Array arr = newArray();                           // 添加数据              arr.add(0);              arr.add(1);              arr.add(3);              arr.add(4);              arr.add(5);              arr.add(6);              arr.add(7);              arr.add(2);              arr.add(9);              arr.add(8);              arr.add(10);                           // 显示数据              arr.display();                           // 删除数据              arr.delete(7);              arr.display();                           //二分查找              arr.binaryFind(5);       }}


3 测试结果

 

 

4 参考文献

[1] Robert,Lafore., Java数据结构和算法.第2版 版. 2004: 中国电力出版社.

[2] Sedgewick Robert与Wayne  Kevin, 算法. 2012: 人民邮电出版社.

 

 

 

 

原创粉丝点击