Java資料結構和演算法(二)——數組,java資料結構
數組的用處是什麼呢?——當你需要將30個數進行大小排列的時候,用數組這樣的資料結構儲存是個很好的選擇,當你是一個班的班主任的時候,每次要記錄那些學生的缺勤次數的時候,數組也是很有用。數組可以進行插入,刪除,尋找等。
1)建立和記憶體配置
Java中有兩種資料類型,基本類型和物件類型,也有人稱為參考型別,Java中把數組當成對象,建立數組時使用new操作符。
int array[] = new int[10];
既然是對象,那麼array便是數組的一個引用,根據Java編程思想(一) —— 一切都是對象 的記憶體配置,array會在棧中開闢空間,並且空間儲存著儲存數組儲存的地址,真正儲存對象的地方是對,new操作在堆中開闢了所需的空間,然後array指向頭地址。
初始化:
public class UseArray { public static void main(String[] args) { int array[] = new int[10]; System.out.println(array[2]); UseArray a[] = new UseArray[12]; System.out.println(a[1]); int array2[] ={1,2,3,4,5,5,6}; }}new後的數組裡面的值被預設初始化為0,而對象的初始化是空的,null,當然還可以通過{}的方式初始化。
2)數組封裝後的使用
public class UseArray { private int[] array; private int number = 0; public UseArray(int max){ array = new int[max]; } public void insert(int value){ array[number] = value; number++; } public int find(int value){ int index = 0; for (int i= 0; i < number; i++) { if(array[i]==value) return index; } return number; } public boolean delete(int value){ int index = find(value); if(index != number){ for (int i = index; i < number-1; i++) { array[i] = array[i+1]; } number--; return true; } return false; } public void display(){ for (int i = 0; i < number; i++) { System.out.printf(array[i]+" "); } } public static void main(String[] args) { UseArray ua = new UseArray(5); ua.insert(1); ua.insert(2); ua.insert(6); ua.insert(7); ua.insert(3); ua.display(); if(ua.find(5) != ua.number){ System.out.println(); }else{ System.out.println("not found!"); } if(ua.delete(5)!=true){ System.out.println("can not delete!"); } ua.display(); }}
將整個數組封裝,用number代替數組的個數,插入資料的時候也不必理會往哪個下標插,當然,也可以自訂一個具體下標的方法。
方法比較簡單就不介紹了,但是存在的一個缺點在delete那裡,其實只是從刪除元素開始的左移而已,所以,雖然number減少了,但是最後一個元素並沒有刪除掉,只是display輸出展示的時候隱藏了而已,但是,下次插入元素的時候新元素便會取代掉最後一個元素的位置。
3)尋找最佳化——二分尋找
public int find(int value){ int start = 0; int end = number-1; while(end>start){ int index =(end + start)/2; if(array[index]==value){ return index; }else if(array[index] >value){ end = index-1; }else { start = index+1; } } return number; }二分尋找前提是數組已經有序。剛開始index寫成end和start相減,造成死迴圈。其實要的是相加。1,2,3,6,7。index=2,value=7,3小於7,start=3,那麼index要的是3和4間的中間數,所以是相加之後除以2,6小於7,start=4,find到7。
排序的話倒是看—— Java資料結構和演算法(三)——簡單排序。
儲存物件的話原理一樣。
4)大O標記法
設N為資料總數,加入插入一個資料時間為K。
那麼線性尋找總時間T=K*N/2,因為尋找的話大概為比較數目的一半。
二分尋找的話T=k*log2(N)。
大O標記法,O可以看成是order of,大約是的意思,k/2也是常數,所以可以看成是O(N)。
數組的缺點呢,就是大小固定,尋找慢,如果你要經常尋找百萬層級的資料,還會用數組嗎?不會的,所以資料結構的選用要結合具體的實際情況,達到最大的效率值。
JAVA資料結構與演算法
給你寫了答案如下,有問題再追問。
B
A
C
確切性
3
infexOf
隊頭指標指向隊尾
對
對
順序表:尋找方便,但插入困難;
鏈表:尋找困難,但插入方便。
// 最大值public static int getMax(int n, int[] arr) {//n是數組最後一個元素的indexif(n == 0)return arr[0];if(arr[n] > getMax(n - 1, arr))return arr[n];return getMax(n - 1, arr);}// 平均值public static int getAverage(int n, int[] arr) {//n是數組最後一個元素的indexif(n == 1)return arr[0];return (arr[n] + getAverage(n - 1, arr) * (n - 1)) / n;}//刪除節點public static Node rmNode(Node head, Node node) {Node temp = head;while(temp.next != null) {if(temp.next == node) {temp.next = node.next;break;}elsetemp = temp.next;}return head;}// 數組元素逆置public static int[] inverseArray(int[] arr) {int start = 0;int end = arr.length - 1;for(; start < arr.length / 2; start++, end--) {int temp = arr[start];arr[start] = arr[end];arr[end] = temp;}return arr;
編寫一個java程式,要可以完成排序與尋找,分別使用鏈表,數組與二叉樹等資料結構,比較各種方法的優缺點
不會java,但是這個問題本質上就是個資料結構的問題,所謂排序和尋找效率依賴的是演算法和資料結構的配合,你現在定下了鏈表(沒有具體說明的話,這裡應該指的是單向鏈表吧)、數組和二叉樹,這幾個之中,那排序和尋找的資料就看用什麼演算法和相應的資料結構配合了~~~
排序演算法中,快速排序是最快的,比較適合用鏈表來處理,但是鏈表的尋找是比較慢的(雙向鏈表的話可以加快尋找速度)。
數組排序會比較慢,不是演算法的問題,而是數組的調整因為需要位移,但是數組一旦排號順序後,尋找是很快的——折半尋找。
二叉數較為平局,排序可以採用堆排序,尋找可以建二叉排序樹來找(用B+或B-樹的話可以更快)。
個人看法,不一定對,歡迎拍磚,具體代碼知道演算法了就自己上網找吧。