選擇排序 堆排序

2021-08-22 04:58:03 字數 1505 閱讀 6605

一、選擇排序

【演算法】每次從餘下待排序記錄中通過比較找到最小的,通過交換,放在待排序記錄的首位。直到全部記錄排好序。

具體如下:

(1)第1趟,從a[0..n-1]中找到最小的記錄,與a[0]交換;

(2)第2趟,從a[1..n-1]中找到最小的記錄,與a[1]交換;

(n-1)第n-1趟,從a[n-2..n-1]中找到最小的記錄,與a[n-2]交換。

【穩定性】不穩定。

【時間複雜度】o(n^2)

不管什麼情況,都需要做(n-1)+(n-2)+...+1=n*(n-1)/2次比較。是效能最差的排序方法。

【示例**】

void selectsort(int n)

}}

二、堆排序

【堆的相關知識】

小根堆定義:小根堆是一棵完全二叉樹,每個節點值小於等於它的兒子值(如果有),所以根結點一定是最小值,但左、右兒子大小不一定。

大根堆定義:大根堆是一棵完全二叉樹,每個節點值大於等於它的兒子值(如果有),所以根結點一定是最大值,但左、右兒子大小不一定。

有三種操作需要掌握:

1、插入(put):

(1)在堆尾加入乙個元素,並把這個結點作為當前結點。

(2)比較當前結點與它的父結點。

如果當前結點值小於父結點,則交換,並把父結點作為當前結點。轉到(2)。

否則,結束。

2、讀取並刪除(get)(涉及向下調整):

(1)取出堆的根結點的值。

(2)把堆的最後乙個結點放到根的位置上,堆長度減1。

(3)把根結點作為now結點。

(4)如果now結點沒有子結點,是結束。否則,比較左、右兒子結點值(如果有右兒子),記小的為next結點。

(5)如果now結點值小於等於next結點值,則結束。否則,交換now結點與next結點,並把next結點作為now結點,回到(4)。

3、調整(adjust)(涉及向上調整):

(1)把最後乙個元素作為now結點。

(2)如果 now結點是根結點,則結束。

(3)記now結點為son結點。

(4)如果son結點值小於它的父結點值,則交換,並將父結點作為son結點,如果新的son結點是根結點,則轉到(5),否則回到(4)。

(5)將now結點前乙個結點作為新的now結點,如果新的now結點是根結點,則結束,否則回到(4)。

【穩定性】不穩定。

【時間複雜度】o(nlogn)。最好、最壞情況區別在於有沒有交換及比較次數有不同,但時間複雜度都是o(nlogn),

【示例**】

1、邊讀記錄邊建小根堆,建好後,再邊讀取邊輸出。

#include#includeusing namespace std;

int n,d,heap[100],heap_size=0;

void heap_put(int d)

}int heap_get()

【參考文獻】

1、2、c++資訊學奧賽一本通

排序 選擇排序 選擇排序 堆排序

寫在前面 上傳github交換排序選擇排序 堆排序 選擇排序 顧名思義,我們就可以猜到,它是原則合適的元素放到合適的位置 從圖中,我們可以得到 1.用第乙個元素,和其他所有的元素進行比較,找出最小的,然後進行交換 2.然後進行,資料的遞增 3.直到資料全部有序 void selectsort int...

選擇排序 堆排序

選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。選擇排序是不穩定的排序方法 比如序列 5,5,3 第一次就將第乙個 5 與 3 交換,導致第乙個5挪動到第二個...

選擇排序 堆排序

堆排序 堆排序分為兩個過程 1 將原來無序的數列,轉化成堆序列 建初識堆的過程 2 輸出堆頂元素並調整建新堆的過程 資料結構偽 typeof sqlist heaptype void heapadjuisti heaptype h,int s int m for i h.length i 1 i c...