演算法與資料結構:
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 ...