選擇排序的時間復雜度分析
每一趟從待排序的數據元素中選出最小(或最大)的一個元素,順序放在已排好序的數列的最前(最後),直到所有待排序的數據元素排完。選擇排序是不穩定的排序方法。
選擇排序是給每一個位置選擇當前元素最小的,比方給第一個位置選擇最小的,在剩余元素裏面給第二個元素選擇第二小的,依次類推。直到第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)。
選擇排序的時間復雜度分析