1. 算法思想:
简单选择排序是通过每次遍历待排序序列,选出一个最小的放在起始位置(假设我们要得到递增序列),这样在经过n-1趟处理后,最终可以得到有序序列
2. 算法实现:
void Simple_sort(int a[],int len)
{
for (int i = 0; i < len; i++)
{
int min = i;//记录最小位置的数组元素的下标,便于最后的交换
for(int j=i+1;j<len;j++)
{
if (a[j] < a[min]) { min = j; }
}
swap(a[i], a[min]);
}
}
需要注意的是:
1. 第五行代码 min = i,这里记录的是最小位置元素的下标,如下是错误写法:
void Simple_sort1(int a[],int len)
{
for (int i = 0; i < len - 1; i++)
{
int min = a[i];//错误写法,这样最终只是交换了最小值和a[i],而不是交换了最小值所在的位置和a[i]的位置
for (int j = i + 1; j < len; j++)
{
if (a[j] < min)
{
min = a[j];
}
}
swap(min, a[i]);
}
}
错误原因在于:这里存储的是最小值而不是最小值元素的数组下标,这样做会导致在最后交换的时候,交换的不是数组序列中的元素,而是直接将起始元素以最小值覆盖
3. 算法复杂度分析:
①空间复杂度:只设立了用于遍历循环的辅助变量,因此空间复杂度为O(1)
②时间复杂度:无论关键字有序还是逆序,一定需要进行n-1趟处理,对比关键字的总次数是:
(n-1)+(n-2)+...+2+1 = n(n-1)/2次,即时间复杂度为O(n2)