今天開始,我就把自己學習的過程記錄下來,避免自己學了之后就忘記了,讓自己能夠堅持下去,希望會有所收獲。
數據結構,包含兩個方面:
邏輯結構:集合結構,線性結構,樹形結構,圖標結構。
存儲結構:表,堆棧,隊列,數組,樹,二叉樹,圖。二叉樹和圖我還不知道怎么回事,以后學了在總結。
我好像總結完事了,但是好像什么也沒說似的,看來要經常寫才行,語言組織的不好。
算法:
要完成一個功能,你是怎么做到的,你的思路就是算法。
衡量的幾個標準
空間復雜度:代碼行數
時間復雜度:排序的個數n,以及for循環,數據交換。執行的效率
O(n):
O(n)=n2+n+100 =>n2
O(n)=n3+n2+n=>n3
應用場景:這個也是比較重要的,比方說10個整數的數組使用Arrays.sort(array)進行排序,就不太妥當,里面實現的空間復雜度太大,100多行的代碼,就排序10個數這不一定是最好的。應該使用冒泡或者是選擇排序。
冒泡排序:
思想:1.如同燒開水,水泡向上咕嚕咕嚕越來越大。每次比較相鄰的兩個數據,將大的向后靠。
代碼如下:
for(int I = 0;i<array.length-1;i++){
????if (array[i] > array[i+ 1]) {
????????swap(I,i+1);????
????}
}
2.這樣循環一次之后,最大的數就到了數組的最后了。
將這樣的操作執行array.length-1次,就冒泡結束了。
for(int j=array.length-1;j>0;j--){
????for(int I = 0;i<j;i++){
????????if (array[i] > array[i+ 1]) {
????????????swap(I,i+1);
????}
}
}
時間復雜度:第一次需要n-1個數比較,第二次需要n-2次比較,最后兩個數比較1次就好了
O(n)=(n-1)+(n-2)+....+1=((n-1)+1)*(n-1)/2=n*(n-1)/2
這樣冒泡就OK了,也是可以做個優化的,可以在if里面做判斷,如果沒有可以交換的數據,可以提前退出外層for循環。
選擇排序:
思路:
1.第一個數作為參考點,假設是最小的數據。在剩下的數據中遍歷出來最小的數據,如果比第一個還小,那就和第一個數據進行交換位置。
int index = 0;//參考點
for(int I=index + 1;i<array.length-1;i++){
? ? if(array[I]<array[index]){
? ? ? ? index = I;
????}
}
swap(index,0);
這樣,經過一次的選擇排序,就會有一個最小的數據被選出來,放到了參考點的問題位置。
2.將參考點向后移動,在進行array.length-1次選擇。
for(int j = 0; j < array.length-1;j++){
? ? int index = j;
????for(int I=index + 1;i<array.length-1;i++){
????????if(array[I]<array[index]){
????????????index = I;
????????}
????}
????swap(index,j);//j 是參考點,index是遍歷出來后的最小的元素,將他們互換。
}
時間復雜度:
第一個參考點需要比對n-1次,第二個參考點需要比對n-2次,......比對1次
O(n)=(n-1)+(n-2)+....+1=((n-1)+1)*(n-1)/2=n*(n-1)/2
冒泡和選擇的區別:
冒泡:相鄰的兩個數據交換的次數比較頻繁,但是可以提前退出外循環。
選擇:比較兩個兩個數的大小次數多,但是數據交換的次數少,最壞的情況是要進行n-1次交換。
這兩種排序通常使用在10個數據以內的排序,性能沒什么差異。但是數據量超過10個,考慮其他排序方式。