排序演算法(三)選擇排序

2021-10-03 03:24:41 字數 3230 閱讀 5796

基本思想

每一趟在後面n-i+1個待排序的元素中找到最小的然後放置在第i個位置,就是位置0-length-1下標相當於是已經知道順序的了,然後在序列裡找每組序列的最小元素放在這個已知位置就可以了。

基本思想

每一趟排序記錄當前元素的最終位置,設定乙個變數,每當要交換的時候,隨時更改變數的值

#include

using

namespace std;

void

easychoicesort

(int

*array,

int length)

;int main ();

int length=10;

easychoicesort

(array,length)

; cout<<

"result1:"

;for

(int i=

1;i<=

10;i++

) cout<<<

" ";

cout

}void

easychoicesort

(int

*array,

int length)

//一開始沒加這句,其實無形之中提公升了效率,如果位置都相同的話,就不用再交換一次了

if(location!=i)

}}

簡單排序演算法效能分析

效能分析

空間o(1)

時間簡單排序的過程中,元素移動的操作次數很少,不會超過3(n-1)次,最好的情況是移動0次,此時對應的表已經有序;但元素間比較的次數與序列的初始狀態無關,始終是n(n-1)/2次,所以時間複雜度為o(n2)

穩定性不穩定

適用性順序表,但是如果給鍊錶其實也可以

堆排序特點

在排序過程中,將整個順序表看成一棵完全二叉樹的順序儲存結構,利用完全二叉樹中雙親結點和孩子結點之間的內在關係,在當前無序區中選擇關鍵字最大(或最小)的元素。

堆的定義

大根堆最大元素存放在根結點中,且對任意非根結點,它的值小於或等於其雙親結點

小根堆最小元素存放在根結點中,且對任意非根結點,它的值大於或等於其雙親結點

相關演算法思路

#include

using

namespace std;

void

buildmaxheap

(int

*array,

int length)

;void

adjustdown

(int

*array,

int k,

int length)

;void

heapsort

(int

*array,

int length)

;void

adjustup

(int

*array,

int length)

;void

deleteelement

(int

*array,

int length)

;void

insertelement

(int

*array,

int length,

int key)

;int main ();

int length=8;

buildmaxheap

(array, length)

; cout<<

"resultinitial:"

;for

(int i=

1;i<=

8;i++

) cout<<<

" ";

cout

(array, length)

; cout<<

"resultdelete:"

;for

(int i=

1;i<=

7;i++

) cout<<<

" ";

cout

cout<<"result1:";

for(int i=1;i<=8;i++)

cout}//初始建堆

void

buildmaxheap

(int

*array,

int length)

}//先從巨集觀上看不要陷入演算法的細節

//函式adjustdown是為了找到k的最終位置,而在尋找的過程中把中間不恰當的位置都掉換了

void

adjustdown

(int

*array,

int k,

int length)

} array[k]

=array[0]

;//找到最終k的位置

}//堆排序演算法

//第乙個位置排列的一定是最大的元素,利用最後乙個元素與第乙個元素交換,然後向下調整

//這樣最後乙個位置放置的就是整個序列中最大的元素,然後依次遞減

void

heapsort

(int

*array,

int length)

}//堆中元素刪除演算法

void

deleteelement

(int

*array,

int length)

//堆中元素插入操作

void

insertelement

(int

*array,

int length,

int key)

//向上調整堆的演算法

void

adjustup

(int

*array,

int length)

array[length]

=array[0]

;}//明確當前操作的是哪個結點,真正對結果有影響的是哪個結點,不要被其他部分干擾

堆排序演算法效能分析

效能分析

時間建堆時間為o(n),之後有n-1次向下調整操作,每次調整的時間複雜度為o(h)【樹的高度】,在最好、最壞、平均情況下時間複雜度為o(nlog2n)

空間o(1)

穩定性不穩定

適用性利用了完全二叉樹的性質,用順序表儲存

排序演算法(三) 選擇排序

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

排序演算法 (三)選擇排序

author 閆振興 contact 1753502691 qq.com datetime 2020 5 23 18 14 software pycharm 檔案說明 encoding utf 8 選擇排序 首先在未排序序列中找到最小 大 元素,存放到排序序列的起始位置。再從剩餘未排序元素中繼續尋找...

排序演算法(三) 選擇排序演算法

選擇排序演算法首先從序列中選擇乙個元素arr i 通常是第乙個 作為當前最小值,然後把arr i 依次與序列中arr i 之後的元素作比較,如果有元素小於arr i 的,就讓它跟arr i 交換。然後再選擇arr i 1 作為下一輪比較的最小值,然後繼續比較.選擇排序演算法原理很簡單,就是每次把未排...