一。為什麼要學習資料結構?
資料結構是程式設計的基礎。
程式設計水平 = 資料結構基礎 + 演算法 + 設計模式
1.什麼是資料結構?
資料結構是研究[b]非數值計算[/b]的程式中的[b]操作物件[/b],以及這些操作物件之間的[b]關係[/b]與[b]操作[/b]。
2. 時間複雜度大小比較:
o(1) < o(logn) < o(n) < o(nlogn) < o(n的平方)< o(n的立方) < o(2的n次方) < o(n!) < o(n的n次方)
o(log(n)) 的時間複雜度:如對二叉樹的查詢,每次可排除一半。
int count = 1;
while (count < n)
3. 演算法的五個特性:
1)輸入
2)輸出
3)有窮性
4)確定性
5)可行性
4. 演算法設計追求的目標:(寫程式時要從這4點考慮)
1)正確性 : 把各種可能考慮到
2)可讀性 : 加注釋
3)健壯性 : 無論何種情況,不能讓程式掛掉,對exception要做處理
4)時間和空間複雜度 : 演算法優劣的關鍵
二.棧、佇列、鍊錶、二叉樹的底層實現
線性儲存可分為:陣列 和 鍊錶
陣列和鍊錶都可實現:
棧和佇列
1. 棧:底層實現是陣列 --> 先進後出
成員變數:
private long arr;
private int top; //用於標記棧頂的元素,以方便出棧。(所謂棧頂元素,就是陣列的最後乙個元素)
2. 佇列:底層實現是陣列 --> 先進先出
成員變數:
private long arr;
private int size; //有效元素個數
private int front; //隊頭
private int end; //隊尾
3. 鍊錶:相對於陣列(連續的儲存空間),鍊錶是不連續的儲存空間
成員變數:
private long data; //資料域
private node next; //指標域
4. 二叉樹
成員變數:
private long data;
private btree left;//左子樹
private btree right;//右子樹
三. 資料結構中經典演算法:
1. 二分法查詢
前提:資料必須有序
要求:查詢指定的值在有序的陣列中,返回對應陣列元素下標。
演算法:用當前元素與中間大小元素比較,若小於,則取左邊子陣列的中間元素做比較。
public static int binarysearch(int arr, int key)
while (start <= end) else if (key > arr[middle]) else
}return -1;
}2. 八種排序演算法:
分類:
1)插入排序(直接插入排序、希爾排序)
2)交換排序(氣泡排序、快速排序)
3)選擇排序(直接選擇排序、堆排序)
4)歸併排序
5)分配排序(基數排序)
所需輔助空間最多:歸併排序
所需輔助空間最少:堆排序
平均速度最快:快速排序
不穩定:快速排序,希爾排序,堆排序。
[img]
(1)插入排序
1)直接插入排序
演算法思想:在需要排序的一組數中,假設前面n-1(其中n>=2)個數已經是排好序的,現在要把第n個數插入到前面的有序陣列中。如此往復迴圈,直至所有數都排好序。
[img]
public static void insertsort(int arr)
arr[j + 1] = tmp; //把tmp移動到原來a[j]即a[i - 1]的地方,因為左右執行了j--, 所以arr[j + 1] = tmp;
}system.out.print("第" + (i + 1) + "次:");
for (int t : arr)
system.out.println();
}for (int i : arr)
}2) 希爾排序(shell排序)
演算法思想:將要排序的陣列按某個增量d(d=n/2; n是要排序陣列的元素個數)分成若干組,每組記錄的下標相差d, 然後對每組中的元素進行直接插入排序,然後再用乙個較小的增量(d/2) 對它進行分組,再對每組中的元素進行直接插入排序。當增量減到1時,執行直接插入排序後,排序完成。
[img]
(2)交換排序
1) 氣泡排序
基本思想:對於要排序的陣列,對未排序的範圍內的元素,自左到右對相鄰兩個數做比較,數大的向右移動,數小的向左移動。即:當發現左邊比右邊的數大時,互動他倆的位置。
[img]
public static void bubblesourt(int arr) }}
}2)快速排序
基本思想:選擇乙個基準元素(通常選擇第乙個元素或者最後乙個元素),然後將需要排序的陣列分成兩部分,一部分比基準元素小,一部分比基準元素大或等於。此時,基準元素就在整個陣列的正確位置。然後再用同樣的方法遞迴地排序劃分的兩部分。
快速排序在元素少時效率不好,這時可以用插入排序。
[img]
public class quicksort
arr[low] = arr[high];
while (low < high && arr[low] <= base)
arr[high] = arr[low];
}arr[low] = base;
return low;
}public static void sort(int arr, int low, int high)
}public static void main(string args) ;
sort(arr, 0, arr.length - 1);
for (int e : arr) }}
(3) 選擇排序
1)簡單選擇排序
基本思想:在要排序的陣列中,選出最小的數與第乙個數交換位置;然後再剩下的數當中找出最小的數與第二個數交換位置,如此迴圈,知道倒數第二個數與最後乙個數交換位置。
[img]
2)堆排序
基本思想:堆排序是樹形選擇排序,是對簡單選擇排序的改進。
堆:完全二叉樹,且堆頂元素大於(或小於)其左右節點
[img]
(4) 歸併排序(merge排序)
基本思想:將兩個(或兩個以上)的有序表合併成乙個新的有序表,即把待排序的陣列分為若干個子陣列,每個子陣列都是有序的,然後再把有序的子陣列合併成乙個整體有序的陣列。
[img]
(5) 基數排序
基本思想:將所有待排序的數值(正整數)統一為統一的數字長度,將數字較短的數前面補零。然後,從最低位開始,一次進行一次排序。這樣,從最低位排序一直到最高位排序完成以後,數列就變成了乙個有序的序列。
[img]
3. 排序演算法的時間空間複雜度:
[img]
資料結構和演算法
判斷乙個演算法的效率時,函式中的常數和其它次要項常常可以忽略,而更應該關注主項 最高項 的階數。演算法時間複雜度的定義 在進行演算法分析時,語句中的執行次數t n 是關於問題規模n的函式,進而分析t n 隨n的變化情況並確定t n 的數量級。演算法的時間複雜度,也就是演算法的時間量度,記作 t n ...
資料結構和演算法
程式是什麼?好多書上都寫著 程式 資料結構 演算法。可是怎麼去理解呢?好多程式設計人員對資料結構和演算法說不上熟悉,因為在他們所從事的工作中很少用到這些知識點。但並不表示他們不重要。還有一些人是這樣的想法 大公司才會注重這些知識點,小公司可能就不注重了。寫這篇文章之前我也是持這種想法的。但是,此時此...
資料結構和演算法
一 資料結構 1.概念 資料結構就是資料之間的結構關係,或者理解成資料元素之間存在的一種或者多種特定關係的集合,在傳統上資料結構分為邏輯結構與物理結構 1 邏輯結構 只反映資料元素之間的邏輯關係的資料結構,其中的邏輯關係是指資料元素之間的前後關係,而與他們在計算機中的儲存位置無關,有以下四類 集合結...