#include#includeusing namespace std;
//簡單選擇排序
//每次從剩下的序列中與第乙個元素作比較,選擇最小的乙個元素放在最前面,共n-1趟
//時間複雜度為o(n^2)
//不穩定排序
void ******_select(vector&vec)
} }}//從start指向的結點向下調整,直至end指向的結點
void adjustdown(vector&vec, int start, int end)
else
break;
start = child_index;
child_index = 2 * start + 1; }}
//堆排序
//將l[1...n]看作是一顆完全二叉樹的順序儲存結構,堆排序就是對這棵二叉樹進行優化、構造堆的乙個過程。
//小根堆:所有結點大於父結點的關鍵字值;
//大根堆:所有結點小於父結點的關鍵字值;
//堆和二叉排序樹的區別:
//1.堆中結點的孩子沒有次序規定,而二叉排序樹中父結點的關鍵字大於左子樹、小於右子樹;
//2.對兩種樹執行中序遍歷後,二叉排序樹能得到乙個有序序列,而堆不一定。
//堆排序過程:
//1.先建立大根堆
//從第n / 2 - 1個節點(總數為10,n等於9,也就是第乙個葉節點的父節點)開始到根節點依次向下調整(保證每一層的節點都比它的所有子節點都大)
//2.調整堆
//a.首尾互換,將最後乙個點(已排序好的點)摘出來
//b.依次對前k = n - 1個節點向下調整(保證每一層的節點都比它的所有子節點都大)
= k - 1,迴圈a和b步驟,直到剩下乙個節點。
//時間複雜度分析:o(nlogn)
//1.建立堆的時間複雜度:
//建立堆的過程就是從起始結點開始向下每一層進行訪問並在比較大小後交換父子結點值,所以頻數和就等於訪問次數的總和。
//這個堆是乙個完全二叉樹,共n個點,高度為h,為方便計算將此堆視為乙個滿二叉樹,則n = 2 ^ (h - 1) - 1
//第h - 1層訪問次數:2 ^ (h - 2) * 1
//第h - 2層訪問次數:2 ^ (h - 3) * 2
//。。。
//第1層訪問次數:2 ^ (h - h) * h
//則s= 2 ^ (h - 2) * 1 + 2 ^ (h - 3) * 2 + 。。。+ 2 ^ (h - h) * h
//通過s-s/2可求出s=n+log(n+1)-1
//即時間複雜度為o(n)
//2.堆排序時間複雜度
//從最後乙個點開始依次向下調整,總共n - 1趟 ,每一趟為o(logn),所以時間複雜度為(n - 1)*o(logn)
//所以程式的整體時間複雜度為:o(n) + (n - 1)*o(logn),即o(nlogn)
//3.堆的操作的時間複雜度
//堆的插入:現將新結點放在堆的末端,再向上調整,o(logn);
//堆的刪除:刪除堆頂時,將堆的最後乙個元素填補,再向下調整,o(logn):
//4.堆排序空間複雜度
//因為堆排序是就地排序,空間複雜度為常數:o(1)
void heapsort(vector&vec)
}int main()
; for (unsigned int i = 0; i <= vec.size() - 1; i++)
cout << endl;
heapsort(vec);
for (unsigned int i = 0; i <= vec.size() - 1; i++)
system("pause>nul");
return 0;
}
演算法 選擇排序,例項分析選擇排序演算法
選擇排序,將乙個序列看做兩個部分,前面有序,後面無序,每次在後面的無序序列中,選擇乙個最小的元素,交換到前面有序序列的末尾,直到無序序列全部完成交換,即可完成排序 選擇排序是不穩定的排序演算法 有乙個序列 5,2,0,1,3,1,4 第一趟排序 第二趟排序 此時我們看到,經過兩趟排序,前面兩個元素 ...
排序演算法 選擇排序
private static int leftchild int i private static void perc int a,int i,int n for int i 0 ir j break else public static void heasp int r,int n for i 0...
排序演算法 選擇排序
摘自 wiki百科 選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小元素,然後放到排序序列末尾 目前已被排序的序列 以此類推,直到所有元素均排序完畢。c語言實現 vo...