第13章 演算法

2021-09-02 07:01:31 字數 2117 閱讀 5066

一、字串反轉

void char_reverse(char* cha)

}

呼叫**如下:

char ch = "hello,world";

char_reverse(ch);

二、鍊錶反轉

// 返回反轉後的煉表頭結點

return newh;

}三、有序陣列合併

// 將有序陣列a和b的值合併到乙個陣列result當中,且仍然保持有序

void mergelist(int a, int alen, int b, int blen, int result)

else

// 指向合併結果的下乙個儲存位置

i++;

}// 如果a陣列有剩餘

while (p < alen)

// 如果b陣列有剩餘

while (q < blen)

}

四、hash演算法

面試時往往不是讓面試者實現乙個hash演算法,而是給出乙個具體場景,如:在乙個字串中找到第乙個只出現一次的字元?

思路:字元(char)是乙個長度為8的資料型別,因此總共有256種可能。每個字母根據其ascii碼值作為陣列的下標對應陣列的乙個值,這個值記錄該字元出現的次數。此處的hash函式就是通過給定字母得到其ascii碼值。**如下:

// 查詢第乙個只出現一次的字元

char findfirstchar(char* cha)

// 定義乙個指標 指向當前字串頭部

char* p = cha;

// 遍歷每個字元

while (*p != '\0')

// 將p指標重新指向字串頭部

p = cha;

// 遍歷每個字母的出現次數

while (*p != '\0')

// 反之繼續向後遍歷

p++;

}return result;

}

五、查詢兩個子檢視的共同父檢視

倒敘比較找到第乙個不一樣的檢視,此時前面遍歷過的檢視都是共同父檢視。**如下:

- (nsarray *)findcommonsuperview:(uiview *)viewone other:(uiview *)viewother

// 如果不相等,則結束遍歷

else

}return result;

} - (nsarray *)findsuperviews:(uiview *)view

return result;

}

六、求無序陣列當中的中位數

當n為奇數時,中位數為(n+1)/2;當n為偶數時,中位數為有兩個。本節基於快排查找中位數。**如下:

//求乙個無序陣列的中位數

int findmedian(int a, int alen)

else

}//找到了

return a[mid];

} int partsort(int a, int start, int end)

//右邊找比key小的值

while (low < high && a[high] >= key)

if (low < high)

}int temp = a[high];

a[high] = a[end];

a[end] = temp;

return low;

}

七、常用排序演算法

參考我的部落格。

《演算法導論》筆記 第13章 13 2 旋轉

旋 保持二叉查詢樹性質的查詢樹區域性操作。左旋 void leftrotate node x y p x p if x p nil else else y l x x p y 右旋 void rightrotate node x y p x p if x p nil else else y r x ...

演算法導論 第13章 紅黑樹

特點 1 每個節點的顏色或是紅,或是黑 2 根節點是黑色 3 葉節點是黑色 4 如果乙個節點是紅色,則葉子為黑 5 對每個節點,從該節點 紅黑樹插入流程 第一步 和bst的插入過程相似,將待插入節點z插入到乙個紅黑樹的葉子節點,並著紅色 因為第一步之後可能會違反紅黑樹的某些性質,所以要進行下一步 第...

第13章 物件導向程式設計 13

13.13.3 迭代器 randseq和anyiter 1.randseq from random import choice class randseq object def init self,seq self.data seq def iter self return self def nex...