簡單說就是第一次找到最小的放到第一個元素位置,第二次找到第二小的放到第二個元素位置......
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");
}
留言列表