資料結構與演算法的那些事

2021-08-30 22:05:25 字數 1576 閱讀 7811

先佔坑,再補充。

常用演算法:

(1)排序:快排、歸併排序、插入排序、希爾排序、桶排序;

(2)分治演算法(divide-and-conquer),回溯演算法,貪婪演算法,動態規劃(dp);

(3)二分查詢(binary search);

演算法目標:

待排序陣列s ---> 排序後 ---> 從小到大遞增陣列s'

1、快排(quick sort)

演算法思路:

就是找出乙個元素(樞紐元),然後將s劃分成兩個不相交的集合,其中乙個集合s_small的所有元素都比樞紐元小,另外乙個集合s_big的所有元素都比樞紐元大,然後對這兩個集合遞迴進行以上操作;快速排序也是一種遞迴的分治演算法。

演算法複雜度:o(nlogn)

演算法步驟:

(1)使用三數中值分割法來選出標兵p(也即在待排序陣列s的首尾和中間位置三個元素選出最大的作為標兵p);

(2)將標兵與陣列s最後乙個元素交換位置;

(3)指標i指向陣列s的首元素,指標j指向陣列s的倒數第二個元素,指標i從左往右跳過比標兵p小的元素,停在大於等於p的元素位置上,而指標j從右往左跳過比標兵p大的元素,停在小於等於p的元素位置上,然後指標i和指標j交換指向元素的值;

(4)重複步驟(3),直到指標i在指標j的右邊,也即i > j;

(5)把指標i指向的元素和s的最後乙個元素交換位置,此時指標i左邊的元素集合為s_small,都比指標i指向的元素小,但是無序,而指標i右邊的元素集合為s_big,都比指標i指向的元素大,但是無序;

(6)對s_small和s_big遞迴執行(1)-(5)。

**實現:

2、歸併排序(merge sort)

演算法思路:

把問題轉化為將兩個有序的序列合併成乙個有序的序列,也即將乙個無序陣列等分為兩個無序陣列,然後對這兩個無序陣列應用歸併排序演算法變為有序陣列,再合併,得到結果,這其實就是典型的分治策略。

演算法複雜度:o(nlogn)

演算法步驟:

如果s的元素個數小於2,則直接返回s,否則對s的前半部分和後半部分遞迴呼叫該歸併演算法,然後將返回結果,即兩個有序的陣列合併,即為最後的排序結果。

**實現:

三、二分查詢(binary search)

演算法目標:

對於已經排序的陣列s,查詢元素target是否在s中,如果在,則返回位置,否則返回-1;

演算法思路:

(1)將target與s[middle]元素比較,如果target > s[middle],則說明target元素有可能在s的middle+1~right區間中,否則就說明target元素有可能在s的left~middle-1區間中;

(2)對(1)中得到的新區間位置,重複(1),直到left > right;

**實現:

資料結構與演算法 演算法 演算法和資料結構

資料結構與演算法 演算法 好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您一開始或至少在我的情況下,並且我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟...

資料結構 資料結構與演算法01

1 求一組整數中的最大值。演算法 基本操作是 比較兩個數的大小 模型 仔細想想 你並不知道這個整數到底是多大?整數過大你該怎麼去表示?2 足協的資料庫管理的程式 演算法 需要管理的專案?如何管理?使用者介面?模型 3 資料與資料結構 資料 所有能被輸入到計算機中,並被計算機處理的符號的集合計算機操作...

資料結構 資料結構與演算法02

1 演算法設計的原則 設計演算法時,通常應考慮達到以下目標 1,正確性 2,可讀性 3,健壯性 4,高效率與低儲存量需求 1,正確性 規格說明 四個層次 a,程式中不含語法錯誤 b,程式對於幾組輸入資料能夠得出滿足要求的結果 c,程式對精心選擇的 典型 苛刻切帶有刁難性的幾組輸入資料能夠得出滿足要求...