简单选择排序
思想:首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。具体做法是:选择最小的元素与未排序部分的首部交换,使得序列的前面为有序。
稳定性 由于每次都是选取未排序序列A中的最小元素x与A中的第一个元素交换,因此跨距离了,很可能破坏了元素间的相对位置,因此选择排序是不稳定的!
//简单选择排序
SelectionSort(int* a , int len)
{
for(int i= 0; i<len; i++)
{
int k=i; //k 是 剩余未排序元素中继续寻找最小元素的键!!
for(int j=k+1; j<len; j++)//继续寻找最小元素的键
{
if(a[k]>a[j])
{
k=j; //最小元素的键
}
}
if(k!=i)
{
int temp = a[i];
a[i] = a[k];
a[k] = temp;
}
}
}
简单选择排序的改进——二元选择排序
简单选择排序,每趟循环只能确定一个元素排序后的定位。我们可以考虑改进为每趟循环确定两个元素(当前趟最大和最小记录)的位置,从而减少排序所需的循环次数。改进后对n个数据进行排序,最多只需进行[n/2]趟循环即可。具体实现如下:
//简单选择排序
SelectionSort(int* a , int len)
{
for(int i=1; i<=len/2; i++)//len/2次就好
{
int min=i,max=i; //k 是 剩余未排序元素中继续寻找最小 大元素的键!!
for(int j=i+1; j<=len-i; j++)//继续寻找最小 大元素的键
{
if(a[min]>a[j])
{
min=j; //最小元素的键
}
if(a[max]<a[j])
{
max=j; //最大元素的键
}
}
if(min!=(i-1)) //---->
{
int tempMin = a[i-1];
a[i-1] = a[min];
a[min] = tempMin;
}
if(max!=(len-i))//<----
{
int tempMax = a[len-i];
a[len-i] = a[max];
a[max] = tempMax;
}
}
}