簡單說就是第一次找到最小的放到第一個元素位置,第二次找到第二小的放到第二個元素位置......

BIG OH大約是.... n+n-1+n-2+...+2 = ((n-2+1)n)/2 = ((n-1)n)/2
因此約等於O(n2

為什麼不做到最後一個?當然是因為沒有必要。

這樣解釋吧...,當我們使用兩個迴圈結構進行排除與搜尋的時候,開始當然都是從0開始,第二層的結束邊界也沒有問題,一定是做到完才有辦法每個元素都抓到;可是第一個迴圈呢?第一個迴圈當然跑到邊界極限的「前一個」就好。

這樣形容吧,當你元素只有兩個的時候,i = 0, j= 1就可以進行比較,只需要做一次。
如果元素有三個,i = 0的時候, j =1 開始,j = 2結束。i = 1的時候, j = 2開始,然後結束。當 i  = 2的時候呢?自己跟自己比較完全沒意義,所以就不需要了。

那如果有人問,依照這種邏輯,其實運算次數應該是 ((n-1)(n-1))/2 不是嗎?那位什麼要寫成 ((n-1)n)/2這樣?
理由很簡單,因為方便。別忘記我們算的是時間複雜度而不是精確次數,最後BIG OH的結果都是O(n2) 就沒有什麼好計較的了。

 

以下為範例:

 

#include <iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;

#define SWAP(a,b){int temp = a;a=b;b=temp;}
const int size = 10;

void SS(int a[], int size)
{
    for(int i=0;i<size-1;i++)
    { int t=i;////////////////////////////////////////////////這一行放錯位置就掰掰了
        for(int j=i+1; j<size; j++)
        {
            if(a[t]>a[j]){ t = j;}
        }
        SWAP(a[i],a[t]);
    }
}

void print(int a[], int size)
{
    for (int i=0;i<size;i++)
    {
        cout<<a[i]<<"\t";
    }
}

void main()
{
    srand(time(NULL));
    int arr[size]={0};
    for (int i=0;i<size;i++)
    {
        arr[i] = rand()%(100)+1;
    }
    cout<<"排序前: \n"<<endl;
    print(arr,size);
    SS(arr,size);
    cout<<"排序後: \n"<<endl;
    print(arr,size);
    system("pause");

}

arrow
arrow

    archerdevil 發表在 痞客邦 留言(0) 人氣()