选择排序
原理
选择排序通过每一趟遍历从待排序的元素中找到最大(最小)的元素,将找到的元素放至已排序的元素之后,直到最后一个元素放到指定位置。
思路
1、首先从原始序列中找到最大(最小)的元素,将最大(最小)的元素和第1个元素交换位置
2、再遍历剩余的n-1元素(即未排序元素),找到其中最大(最小)的元素,将最大(最小)元素和第2个元素交换位置(即和未排序元素的第1个元素交换位置)
3、以此,对剩余的n-i未排序元素重复进行第二步操作,每次都将最大(最小)元素交换至第i+1个位置(未排序元素的第1个位置),直到未排序元素个数为0,则完成排序。
过程
对序列5,8,5,6,2;实现从大到小排序
第一轮排序过程:
第二轮排序过程:
第三轮排序过程:
第四轮排序过程:
实现
// 选择排序
void selectionSort(int array[], int len)
{
int max,temp;
for (int i = 0; i < len; i++)
{
max = i; // 假设未排序元素第一个位置为最大元素
for (int j = i; j < len; j++)
{
if (array[j] > array[max])
max = j;
}
if (max != i) // 最大元素未在正确位置
{
temp = array[i];
array[i] = array[max];
array[max] = temp;
}
}
}
算法性能
时间复杂度
需要进行n次排序,每次排序的操作次数依次为n,n-1,…,2,1,所以时间复杂度为O(n^2);
算法稳定性
从图示的排序过程中,可以看出选择排序后有可能改变相同元素的相对位置,所以该算法是不稳定的。