資料結構 有序陣列java篇
阿新 • • 發佈:2018-12-06
一:有序陣列特點:
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();
}
}