演算法筆記學習Part3 入門篇 2 排序(待補充)

2021-10-03 04:59:53 字數 3624 閱讀 3827

氣泡排序是排序演算法中最基礎的一種,其本質在於交換:每次通過交換將剩餘元素的最大(小)值移動到一端,而當剩餘元素減少為0時,排序結束。

1.下面是氣泡排序的常規實現:

for

(int i =

0; i < list.length-

1; i++)}

}

在如上的排序中,每次大迴圈都會將最大或最小(根據交換中設定的比較規則)的元素歸位,每次小迴圈從頭開始直到被歸為元素之前每兩個元素進行比較後完成交換

2.氣泡排序的優化(方法來自大話資料結構)

氣泡排序的常規實現,不論過程中是否已經完成排序,接下來的迴圈都會進行,因此存在效率上的損失。如下方法對氣泡排序進行了改進:

bool flag =

true

;for

(int i =

0; i < list.length-1&&

!flag; i++)}

}

該方法中定義了布林變數flag用於標識排序是否已經完成。若在一輪迴圈中沒有發生任何交換,則flag的值為true,會在下一輪的准入判斷中脫出迴圈。而一旦有任一例交換發生,則下一輪迴圈繼續進行。

3.冒泡迴圈的再優化(方法來自

上述改進的冒泡迴圈中,內層迴圈仍存在多餘的交換。為了避免這種情況,可以利用乙個標誌位,記錄一下當前第 i 趟所交換的最後乙個位置的下標,在進行第 i+1 趟的時候,只需要內迴圈到這個下標的位置就可以了,因為後面位置上的元素在上一趟中沒有換位,這一次也不可能會換位置了。基於這個原因,我們可以進一步優化我們的**。

int len = list.length -1;

bool flag =

true

;int tempposition =0;

//記錄交換發生的位置

for(

int i =

0; i < list.length-1&&

!flag; i++)}

len = tempposition;

//將最後一次發生交換的位置給len,縮減內迴圈次數

}

選擇排序是最簡單的排序演算法之一,在書中介紹了最常用的簡單選擇排序演算法

簡單排序演算法是指:對於乙個序列a中的元素a[1]~a[n],令i從1到n列舉,進行n趟操作。每一趟從待排序的部分[i,n]中選擇最小的元素,令其與待排序部分的第乙個元素a[i]進行交換,這樣a[i]就會與當前有序區間[1,i-1]形成新的有序區間[1,i]。於是在n趟排序後,所有元素就會是有序的。

下面是簡單排序演算法的程式設計實現:

for

(int i =

1; i < n; i++)}

//將k標記的最小元素和待排序部分第乙個元素交換,之後已排序部分擴張

int temp = a[i]

; a[i]

= a[k]

; a[k]

= temp;

}

插入排序也是最簡單的一類排序演算法。 插入排序的基本方法是:每一步將乙個待排序的元素,按其排序碼的大小,插入到前面已經排好序的一組元素的適當位置上去,直到元素全部插入為止。在書中介紹了最直觀的直接插入排序方法。

直接插入排序是指:對於序列a的n個元素a[1] ~ a[n],令i從2到n列舉,進行n-1趟操作。假設某一趟時,序列a的前i-1個元素a[1] ~ a[i-1]已經有序,而範圍i到n還未有序,那麼該趟從[1,i-1]中尋找某個位置j,使得將a[i]插入位置j後,範圍[1,i]的元素有序。

下面是直接插入排序演算法的程式設計實現:

int a[maxn]

,n;//n為元素個數,陣列下標為1到n

void

insertsort()

a[j]

= temp;

//插入位置為j

}}

一般在試題中都不需要自己構建排序函式,只需要的到排序的最終結果即可,因此可以直接使用qsort/sort函式進行排序

sort排序函式的使用(6.9.6節內容)

sort是c++中提供的排序函式,根據具體情形使用不用的排序方法,效率較高,且在實現中規避了經典快速排序可能出現的導致時間複雜度退化到o(n^2)的極端情況

1.如何使用sort排序

基本格式:

sort

(首元素位址,尾元素位址的下乙個位址,比較函式)

;//前兩個部分必填,比較函式根據需要新增,沒有時預設遞增排序

使用案例:

#include

#include

using

namespace std;

intmain()

;//將a[0]~a[3]從大到小排序

sort

(a,a+4)

;for

(int i =

0; i <

6; i++

)printf

("\n");

//將a[0]~a[5]從小到大排序

sort

(a,a+6)

;for

(int i =

0; i <

6; i++

)printf

("\n");

//對char型別排序時預設為字典序

return0;

}

2.比較函式cmp

在使用sort函式進行排序時,若比較物件本身缺少可比性時,則需要制定規則來建立可比性。一般會使用sort函式的第三個引數比較函式cmp來實現自定義的比較規則

cmp函式的基本形式如下:

bool

cmp(引數a,引數b)

也可以根據結構體進行一定的變體並新增一些判斷規則:

bool

cmp(node a,node b)

3.c++容器的排序(待補充)

排序題的常用解題步驟

1.構建相關結構體

排序題中的排序隊物件常常涉及到多個屬性,因此可以構建結構體來解題,方便**的編寫

2.cmp函式的編寫

根據題目的排序規則來編寫適當的比較函式

3.排名的實現

部分排序題中,需要計算出個體排名,一般需要在構建結構體時將排名這項屬性加入到結構體中。一般的規則是:分數不同排名不同,分數相同排名相同但占用乙個排位。在陣列排序完成後,可用以下方法實現排名的計算:

從陣列第乙個個體開始順次遍歷整個陣列,若當前個體和前乙個個體分數相同,則排名等同於前乙個個體;否則,當前個體排名等於陣列下標加一(從下標0開始)

而有時題目中不一定需要真的把排名記錄下來,而是直接輸出即可,那麼也可以用這樣的辦法:令int型變數r初值為1,然後遍歷所有個體:如果當前個體不是第乙個個體且當前個體的分數不等於上乙個個體的分數,那麼令r等於陣列下標加1,這時r就是當前個體的排名,直接輸出即可。這樣的做法適用於需要輸出的資訊過多,導致第一種方法**冗長的情況

例題 - 【pat a1025】pat ranking(待補充)

《演算法筆記》學習記錄 Part 3 樹(下)

9.7.1 堆的定義與基本操作 堆是一顆完全二叉樹,樹中的每個結點都不小於 或不大於 其左右結點孩子結點的值,分為大根堆和小根堆 由於是完全二叉樹,可以使用陣列儲存 const int maxn 100 heap為堆,n為元素個數 int heap maxn n 10 對heap陣列在 low,hi...

Python學習筆記 part 3

ide vscode python版本 python3.6 學習教材 python程式設計從入門到實踐 人民郵電出版社 操作列表 for a in b 構建了python的for迴圈,迴圈方式為每次從列表b中取出乙個元素存入a。例如 idiols chen ju liu for idiol in i...

演算法筆記學習 入門篇 2 遞迴

分解 將原問題分解為若干和原問題結構相同或相似的子問題 解決 遞迴求解所有子問題 合併 將子問題的解合併為原問題的解 案例 階乘 案例 斐波那契數列 案例 全排列 一般稱將1 n這n個整數按某個順序擺放的結果稱為這n個整數的乙個排列,而全排列是指這n個整數能夠形成的全部排列。現在需要實現按字典序實現...