演算法與資料結構知識點總結

2021-06-26 19:31:53 字數 3210 閱讀 6026

演算法與資料結構:

1.資料結構:資料、資料元素、資料物件、資料結構、資料型別、抽象資料型別(dat)。

2.演算法:有窮性、確定性、可行性、輸入(0個或多個)、輸出(1個或者多個輸出)。

3.排序演算法

氣泡排序:每次找出最大值,然後放到所在範圍的最後一位(是一種簡單的易於理解的排序演算法,但是效率很低,由於迴圈一次,只是要找出最大元素,好多元素的交換是沒有意義的);

選擇排序:每次找出最小值,放在指定範圍的最前面,並且將最小值所在位置和第乙個元素交換位置。(關鍵是找出指定範圍內的最小元素下標,交換的次數較少)

快速排序:每次找出乙個軸點,將軸點分為兩部分做同樣的操作。效率很高的排序演算法。

4.查詢:

順序排序:從前往後查詢,不靠譜的演算法

二分查詢:必須是有序的表,從中間分為兩個部分。

注:迴圈的終止條件就是遞迴的終止條件,遞迴函式不需要迴圈。

5.鍊錶:和陣列類似,只是陣列大小固定,不能動態的更改陣列大小,資料的插入和刪除困難,但是可以快速的讀取元素。鍊錶的元素儲存單元,可以使連續的,也可以是不連續的。是有多個node連線起來,但是快速定位比較慢。

清空鍊錶的時候,只保留首節點,首先,我們應該得到當前的節點,儲存到乙個node裡面,然後將當前節點指向next,刪除node。注:最後應該將first的next設定為null。

鍊錶的合併:就是講兩個鍊錶聯合在一起,將首節點去掉。

程式:

1.選擇排序:

//最小元素下標

int minkey(int *p, int low, int high)

int key = p[low];

int min = low;

int i;

for (i = low + 1; iif (key > p[i])

key = p[i];

min = i;

return min;

//選擇排序演算法

void select(int p, int low, int high)

int i, j;

for (i = low; i < high; i++)

j = minkey(p, i, high);

if (j != i)

swap(&p[j], &p[i]);

思路:要在指定範圍內找到最小的元素位置;如果指定範圍內的第乙個元素不是最小元素,將最小元素和第乙個元素交換位置,如果是的話,就結束。

2.快速排序

int partition(int p, int low, int high)

int povitkey = p[low];//軸點等於第乙個元素

while (low < high)

while (low < high && p[high] >= povitkey)

high--;

p[low] = p[high];//將小於軸點的元素放到軸點的前面

while (low < high && p[low] <= povitkey)

low++;

p[high] = p[low];//將大於軸點的元素放到軸點的後面

p[low] = povitkey;

return low;//返回軸點的下標

void q_sort(int p, int low, int high)

if (low < high)

int povitloc = partition(p, low, high);//對軸點進行排序,並且得到排序後軸點的位置

q_sort(p, povitloc + 1, high);//遞迴對軸點的下半部分排序

q_sort(p, low, povitloc - 1);//遞迴對軸點的上半部分排序

void quick_sort(int p, int low, int high)

q_sort(p, low, high - 1);

思路:建立乙個軸點(將第乙個元素作為軸點),將大於軸點的值,依次放到軸點的右邊,反之,放在左邊;將軸點分為兩部分做相同的操作。

3.快速查詢 :不需要排序效率低

int bin(int s, int low, int high, int data)

int i;

for(i = low; i < high; i++)

if(data == s[i])

return i;

return - 1;

4.二分查詢:需要排序

//迴圈實現

int bin(int s, int low, int high, int data)

while (low <= high)

int mid = (low + high) / 2;

if (s[mid] == data)

return mid;

else if (data > s[mid])

low = mid + 1;

else

high = mid - 1;

return -1;

//遞迴實現

int bin1(int s, int low, int high, int data)

int mid = (low + high) / 2;

if(low <= high)

if (data == s[mid])

return mid;

else if (data > s[mid])

return bin1(s, mid + 1, high, data);

else

return bin1(s, low, mid - 1, data);

return -1;

思路:在有序集合內分為兩部分,如果中間元素正好和data相等,那麼就返回;如果大於data,那就在前半部分,那就將前半部分作為乙個整體,然後再比較;如果小於data,那就在後半部分,那就將後半部分作為乙個整體,然後再比較;如果沒有找到,就返回-1.

資料結構知識點總結

1 樹 森林 和二叉樹可以相互轉化,規則是 左孩子右兄弟 即當前節點的左孩子在由二叉樹轉化為樹的過程中,左孩子還是當前節點的左孩子,而右節點會變成當前節點的兄弟。2 設二叉樹度為0的節點有n0個,度為2的節點為n2,則n2 n0 1 1 無向圖的資料結構是鄰接多重表,有向圖的資料結構是十字鍊錶。二者...

資料結構知識點總結

佇列 用陣列表示迴圈佇列 為了區分隊空和隊滿,入隊時少用乙個佇列元素,約定以 隊頭指標在隊尾指標的下乙個位置作為隊滿的標誌 也就是說如果隊尾快要趕上隊頭了就認為滿了 也可以通過增加乙個資料成員size,記錄佇列中元素的數量。對於佇列的鏈式儲存結構,不存在溢位的問題。廣義表 例如建立乙個廣義表 ls ...

資料結構知識點總結(五)

1 對於單鏈表 1 帶頭節點鍊錶判空條件 head next null 2 不帶頭節點鍊錶判空條件 head null 3 對於迴圈鍊錶判空條件 head next head 4 對於雙鏈表判空條件 head next head prior head2 1 順序棧判空條件 s.top s.base ...