選擇類排序 直接選擇與堆排

2021-07-29 15:51:34 字數 1270 閱讀 5341

思想

一開始整個陣列預設是無序區,有序區元素為空,每趟從無序區裡面選出乙個最小的元素,與無序區的第乙個元素進行交換,整個時候有序區的元素的元素+1,無序區的元素會-1,下一趟排序再從無序區選擇乙個最小的與無序區的元素進行交換,無序區元素-1.有序區+1,以後執行同樣的操作
**如下

void selectsort(int a,int n)

}//當最小值的下標不是當前元素的時候

if (small!=i)

}}

演算法效率

時間複雜度:o(n);

空間複雜度: o(1);

不穩定排序

直接選擇排序的優化之一:對於重複出現的元素,可以記錄他的出現次數,最後直接放入陣列中就可以

優化之二:堆排:記錄之前比較過得記錄,防止重複比較

思想:

1:構建堆:將陣列中的元素構建成一棵完全二叉樹

2:初始化堆:對完全二叉樹進行調整

* 從最後乙個非葉子節點開始,在當前節點以及其左右孩子街節點裡面找出乙個最大的節點,然後與當前節點交換,其他的也做同樣操作,直到根節點位置。
3:排序:每次取出堆的根節點,然後將它與最後乙個葉子節點交換,若交換之後破壞了堆的規則,則要重新對堆進行調整,後面進行遞迴操作
* 規律就是父節點元素大於或者等於左右孩子節點的元素

* 調整規則就是在每個堆裡面的父節點以及左右孩子節點中找到乙個最大的然後與當前堆裡面的父節點節點交換,要是調整之後破壞了其他堆的規則,也要對其他堆重新進行調整

2:演算法效率:

時間複雜度:由於每次重新恢復堆的時間複雜度為o(logn),共n - 1次重新恢復堆操作,再加上前面建立堆時n / 2次向下調整,每次調整時間複雜度也為o(logn)。二次操作時間相加還是o(n * logn)。故堆排序的時間複雜度為o(n * logn)

空間複雜度:o(1)

不穩定排序

3:總結:堆排是每次從前面選擇最小或者最大元素,然後將其插入後面的有序區,類似於直接選擇排序,採用最小堆得到的是遞減的,採用最大堆得到遞增序列。

直接選擇排序中要從 a[0]~a[n-1]個選擇乙個最小的,需要進行 n-1次比較,要從 a[1]~a[n-1]選擇乙個最小的又要進行 n-2次比較,但這些比較中的有些可能已經在之前 n-1次比較時候比較過,所以就沒有必要,堆排利用樹形結構記錄了以前的比較記錄,所以可以減少重複比較次數,對於大量資料來說優勢明顯

選擇排序 直接選擇排序與堆排序

選擇排序即每次從待排序的數列中選擇乙個最小的元素,然後把它放在已排好序列的最前面 假定這裡從小到大排序 直至序列完全有序。選擇排序分為線性結構的直接選擇排序與非線性的堆排序,後者是用相當於把樹的元素存在陣列中,通過元素下標來區分孩子結點與父親結點等等 1.直接選擇排序 直接上 void select...

選擇排序 直接選擇排序

演算法思想 在每一趟的排序中,從待排序列中選出關鍵字最小或者最大的元素放在其最終的位置上 過程分析 在第i趟直接排序中,通過n i次關鍵字的比較,從n i 1個元素中選出關鍵字最小的元素 與第i個元素進行交換。經過n 1趟比較,直到表有序為止 效能分析 時間複雜度o n 2 include defi...

選擇排序 直接選擇排序

直接選擇排序也成為簡單選擇排序。對於乙個待排序數列,每次從無序區選擇乙個最小的元素,放入有序區 初始時有序區為空 直到無序區元素只有乙個 即整個數列的最大值 具體操作 第i趟排序開始,數列分為有序區a 0,i 1 和無序區a i,n 1 從無序區中選擇最小元素a k 將a k 放在無序區的最左邊的位...