資料結構和演算法

2021-09-01 18:21:49 字數 3544 閱讀 1860

一。為什麼要學習資料結構?

資料結構是程式設計的基礎。

程式設計水平 = 資料結構基礎 + 演算法 + 設計模式

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 邏輯結構 只反映資料元素之間的邏輯關係的資料結構,其中的邏輯關係是指資料元素之間的前後關係,而與他們在計算機中的儲存位置無關,有以下四類 集合結...