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)。
最终,我个人认为,在简单排序算法中,直接插入排序是最好的。