background image

void

 SelectSort( 

int

 *a,

int

 Count)

{

int

 temp; 

//

一个存储值

int

 pos;  

//

一个存储下标

for

(

int

 i=0; i<Count; i++)

{

temp = a[i];
pos  = i;

for

(

int

 j=i+1; j<Count; j++)

if

( a[j] < temp ) 

//

选择排序法就是用第一个元素与最小的元素交换

{

temp = a[j];
pos  = j;  

//

下标的交换赋值,记录当前最小元素的下标位置

}

a[pos] = a[i];
a[i] = temp;

}

}
遗憾的是算法需要的循环次数依然是

1/2*(n-1)*n。所以算法复杂度为 O(n*n)。 

我们来看他的交换。由于每次外层循环只产生一次交换(只有一个最小值)。所以

f(n)<=n 

所以我们有

f(n)=O(n)。所以,在数据较乱的时候,可以减少一定的交换次数。

4、 插入法   【稳定的】

void

 InsertSort( 

int

 *a,

int

 Count)

{

int

 temp; 

//

一个存储值

int

 pos;  

//

一个存储下标

for

(

int

 i=1; i<Count; i++) 

//

最多做n-1趟插入

{

temp = a[i];

//

当前要插入的元素

pos  = i-1;

while

( pos>=0 && temp<a[pos] )

{

a[pos+1] = a[pos]; 

//

将前一个元素后移一位

pos--;

}
a[pos+1] = temp;

}

}
其复杂度仍为

O(n*n)。

最终,我个人认为,在简单排序算法中,直接插入排序是最好的。