1. 程式人生 > >選擇排序的時間復雜度分析

選擇排序的時間復雜度分析

family span lec 時間復雜度 一個 位置 最小 ack 破壞

每一趟從待排序的數據元素中選出最小(或最大)的一個元素,順序放在已排好序的數列的最前(最後),直到所有待排序的數據元素排完。選擇排序是不穩定的排序方法。

選擇排序是給每一個位置選擇當前元素最小的,比方給第一個位置選擇最小的,在剩余元素裏面給第二個元素選擇第二小的,依次類推。直到第n-1個元素,第n個元素不用選擇了,由於僅僅剩下它一個最大的元素了。那麽,在一趟選擇。假設一個元素比當前元素小。而該小的元素又出如今一個和當前元素相等的元素後面。那麽交換後穩定性就被破壞了。比較拗口。舉個樣例,序列5 8 5 2 9,我們知道第一遍選擇第1個元素5會和2交換,那麽原序列中2個5的相對前後順序就被破壞了,所以選擇排序不是一個穩定的排序算法。

方法一:

template<class T>

void SelectSort(T a[],int n)

{

for (int i = n-1;i>0;--i)

{

int max = i;

for (int j = 0;j < i;++j)

if (a[j] > a[max])

max = j;

if (max != i)

Swap(a[i],a[max]);

}

}

方法二:

template<class T>

void SelectSort(T a[],int n)

{

for (int i = n-1;i > 0;--i)

{

int max = 0;

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

if (a[j] > a[max])

max = j;

if (max != i)

Swap(a[i],a[max]);

}

}

方法三:

template<class T>

void SelectSort(T a[],int n)

{

bool sorted = false;

for (int i = n-1;!sorted&&i > 0;--i)

{

sorted = true;

int max = 0;

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

{

if (a[j] > a[max])

max = j;

else

sorted = false;

}

if (max != i)

Swap(a[i],a[max]);

}

}

方法二和方法三更加像冒泡排序了。只是還是有差別的,至少交換的次數變少了。

對於方法一和方法二。比較次數O(n^2)。比較次數與keyword的初始狀態無關,最好和最壞情況下都為O(n^2),可是對於方法三,最好情況下外層循環僅僅運行一次。裏面運行n-1次,因此時間復雜度為O(n)。最壞情況下仍為O(n^2)。



選擇排序的時間復雜度分析