一:有序数组特点:
1:有序数组特点:查询快,插入,删除慢,适合查询多,修改少的环境
2:查询时间复杂度O(log(n)),插入,删除时间复杂度O(n)
3 : 插入平均需要比较n/2 次,移动n/2个元素
4 : 删除是先查找,然后移动n/2个元素
二:二分查找思想
假设有n个元素的有序数组,取数组中间位置的值与检索值比较,如果小于中间值,则利用二分查找在前半部分的有序数组中查找,如果大于中间值,则利用二分查找在前半部分的有序数组中查找,如果相等,则返回索引位置,否则没有找到. 二分查找需要不断的缩小查询的范围。
public class HalfSort {
private int[] aint;
private int size;
public HalfSort(int size) {
aint = new int[size];
size = 0;
}
public void insert(int value) {
int x;
for(x = 0 ; x < size; x++) {
if(aint[x] > value) {
break;
}
}
//移动数据
for(int y = size; y > x; y--) {
aint[y] = aint[y-1];
}
aint[x] = value;
size ++;
}
public boolean delete(int key) {
int keyIndex = find(key);
if(keyIndex == -1) {
return false;
} else {
for(int x = keyIndex; x < size; x++ ) {
aint[x] = aint[x+1];
}
size --;
return true;
}
}
//时间复杂度O(log(N))
public int find(int key) {
int low = 0;
int up = size - 1;
int middle = 0;
while(true) {
middle = (up + low)/2;
if(aint[middle] == key) {
return middle;
} else if(low > up) {
return -1;
} else {
if(aint[middle] > key) {
up = middle - 1;
} else {
low = middle + 1;
}
}
}
}
public void display() {
for(int x = 0; x < size ; x++) {
System.out.print(aint[x] + " ");
}
System.out.println("");
}
public static void main(String[] args) {
HalfSort sort = new HalfSort(10);
sort.insert(10);
sort.insert(3);
sort.insert(20);
sort.insert(17);
sort.insert(13);
sort.insert(31);
sort.insert(25);
sort.display();
int ind = sort.find(10);
sort.delete(20);
sort.display();
}
}