選擇類排序基本思想:每一趟在n-i+1(i=1,2,...n-1)個記錄中選取關鍵字最小的記錄作為有序序列中第i個記錄。
1.簡單選擇排序
void selectsort(recordtype r[ ],int n) //對記錄陣列r做簡單選擇排序,n為陣列長度
for(i=1;i<=n-1;++i)
k=i;
for(j=i+1;j<=n;++j)
if(r[j].key < r[k].key) k=j;
if(k != i)
時間複雜度:o(n2) 最好:o(n2) 最壞o(n2) 空間複雜度o(1)
2.樹形選擇排序
演算法改進要點:在簡單選擇排序中,首先從n個記錄中選擇關鍵字最小的記錄需要n-1次比較,在n-1個記錄中選擇關鍵字最小的記錄需要n-2次比較,.....,每次都沒有利用上次比較的結果,所以比較操作的時間複雜度為o(n2),欲降低比較的次數,則需要吧比較過程中的大小關係儲存下來。
3.堆排序
演算法改進要點:彌補樹形選擇排序占用空間多的遺憾,採用堆排序時,只需要乙個記錄大小的輔助空間。堆排序是在排序過程中,將向量中儲存的資料看成一顆完全二叉樹,利用完全二叉樹中的雙親結點和孩子節點之間的內在關係來選擇關鍵字最小的記錄,即待排序記錄仍採用向量陣列方式儲存,並非採用樹的儲存結構,而僅僅是採用完全二叉樹的順序結構的特性進行分析
堆定義:稱各節點的關鍵字值滿足條件:r[i].key >= r[2i].key 並且 r[i].key >= r[2i+1].key(i=1,2,...,[n/2])的完全二叉樹為大根堆。
反之,如果這顆完全二叉樹中任意節點的關鍵字小於或等於其左孩子和右孩子的關鍵字(當有左孩子和右孩子時),對應的堆為小根堆。
堆排序二個問題:1 按堆定義建初堆 2 去掉最大元素之後重建堆,得到次大元,以此類推
時間複雜度:o(nlog2n) 最好:o(nlog2n) 最壞o(nlog2n) 空間複雜度o(1) 不穩定排序
歸併排序:
基本思想:基於合併,將兩個或兩個以上有序列表合成乙個新的有序表
時間複雜度:o(nlog2n) 最好:o(nlog2n) 最壞o(nlog2n) 空間複雜度o(n) 穩定排序
排序演算法 選擇類排序
選擇排序的演算法思想 重待排序的元素序列中選擇最小 最大 的元素,將其放入在已排序序列的最前 最末 其餘的元素構成新的待排序列。依次類推,直到待排序元素序列中沒有待排元素。選擇排序主要有兩種 簡單選擇排序和堆排序。接下來我們來分別介紹一下這兩種排序演算法。演算法思想 簡單選擇排序是一種簡單的選擇類排...
選擇類排序總結
選擇類排序總結 所謂選擇類排序的思想就是 從陣列的中選出最大或最小的,通過多次選擇最後達到排序的目的 首先是簡單選擇排序 思想 每趟掃瞄中,選出最小的數字放在最前面,然後從第二個數字開始掃瞄,直到只剩下最後乙個數不需要掃瞄 void easyselect sort int a,int n 第三步就是...
選擇類排序 簡單選擇 堆排序
1.執行過程 原始序列 49,38,65,97,76,13,27,49 無序 493865 9776 1327 49從無序序列中選取乙個最小的關鍵字13,使其與無序序列中的第乙個關鍵字交換,則此時產生了僅含有乙個關鍵字的有序序列,而無序序列中的關鍵字減少1個,如下 1338 6597 7649 27...