有序数组和二分法
来源:互联网 发布: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: 人民邮电出版社.
阅读全文
0 0
- 有序数组和二分法
- 有序数组和二分法
- 有序数组和二分法查找
- 二分法查找有序数组
- 有序数组搜索二分法
- 二分法查找有序数组
- 二分法查找有序数组
- 二分法查找有序数组元素
- (二)有序数组的二分法查找
- 二分法在有序数组中进行查找
- 有序数组的二分法查找关键字
- 有序数组用二分法查询位置
- 二分法查找有序数组中的元素
- 【数据结构与算法】有序数组二分法查找
- 数组、数组操作、无序数组、有序数组、二分法
- 数据结构-02 数组(有序数组) -二分法查找(折半查找)
- 二分法计算有序数组中数字出现的次数
- (笔记)数组 插入式排序法 有序查找二分法
- 指针
- HDU 6201 transaction transaction transaction【树形DP||SPFA最长路】
- 递归引发的jvm栈溢出的理解--堆和栈的概念整理
- 内存泄漏与内存溢出神比较
- 选择相机品牌
- 有序数组和二分法
- docker学习一
- 数据库学习笔记-触发器
- gamemaker 更新 runtime 快一点
- java学习旅程(001)数据库知识点整理
- nginx-基于IP的虚拟主机配置
- 练习2
- 黑客零起步——菜鸟必看!
- 关于hashMap利用hashCode数组定位indexFor的理解