如果有N个元素需要排序,那么首先从N个元素中找到最小的那个(称为第0小的)放在第0个位子上(和原来的第0个位子上的元素交换位置),然后再从剩下的N-1个元素中找到最小的放在第1个位子上,然后再从剩下的N-2个元素中找到最小的放在第2个位子上……直到所有的元素都就位。
void SelectionSort(int a[] ,int size)
{
for( int i = 0; i < size - 1; ++i ){//每次循环后将第i小的元素放好
int tmpMin = i;
//用来记录从第i个到第size-1个元素中,最小的那个元素的下标
for( int j = i+1; j < size ; ++j) {
if( a[j] < a[tmpMin] )
tmpMin = j;
}
//下面将第i小的元素放在第i个位子上,并将原来占着第i个位子的元素挪到后面
int tmp = a[i];
a[i] = a[tmpMin];
a[tmpMin] = tmp;
}
}
看执行次数最多的语句执行了多少次。
比较语句一共执行了 (s - 1) + (s - 2) + ... + 1 次,即 s * (s - 1) / 2 次,式子的“量级”是 s ^ 2.
void InsertionSort(int a[] ,int size)
{
for(int i = 1;i < size; ++i ) {
//a[i]是最左的无序元素,每次循环将a[i]放到合适位置
for(int j = 0; j < i; ++j)
if( a[j]>a[i]) {
//要把a[i]放到位置j,原下标j到 i-1的元素都往后移一个位子
int tmp = a[i];
for(int k = i; k > j; --k)
a[k] = a[k-1];
a[j] = tmp;
break;
}
}
}
复杂程度的量级仍然是 size ^ 2.