选择排序(Selection Sort)
经过一趟排序,可以从n-i+1(i=1,2...)个记录中选取关键字最小的记录作为有序序列中第i个记录。也就是说,每一趟排序,都会排好一个元素的最终位置。
最简单的是
简单选择排序(Simple Selection Sort,也叫直接选择排序)
简单选择排序的思想:在每一趟排序中,通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换,以此确定第i个记录的最终位置。简单说,逐个找出第i小的记录,并将其放到数组的第i个位置。
比较简单,直接看代码;
void SimpleSelectSort(int a[], int n) //简单选择排序
{
if(a && n>1)
{
int index;
for(int i=0; i<n; i++)
{
index=i;
for(int j=i+1; j<n; j++)
{
if(a[j]<a[index])
index=j;
}
if(i!=index)
{ //交换数据,方法多种
a[i]^=a[index];
a[index]^=a[i];
a[i]^=a[index];
}
}
}
}
看下代码,两个for循环,每一个都与n有关,粗略估计时间复杂度是O(n^2)。
下面仔细计算一下:
若初始序列是有序的,则无需移动元素。若是逆序的,则需移动3(n-1)(这个数字有问题!)。每确定一个元素的最终位置,swap()方法中一般3次移动,但确定了最小的,也同时确定了最大的。所以这个3(n-1)不可信。但无论如何,它都是线性的。
无论初始序列的情况如何,都必须进行 (n-1)+(n-2)+...