一、選擇排序
【演算法】每次從餘下待排序記錄中通過比較找到最小的,通過交換,放在待排序記錄的首位。直到全部記錄排好序。
具體如下:
(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...