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


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

選擇排序是給每一個位置選擇當前元素最小的,比方給第一個位置選擇最小的,在剩余元素里面給第二個元素選擇第二小的,依次類推。直到第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)。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM