简单选择排序法就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换。
通俗得讲,每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序。
#define N 5
int a[N] = {12,56,80,91,20};
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void SelectSort()
{
for (int i = 0; i < N; i++)
{
min = i; //设当前元素为最小值
for (int j = i+1; j < N; j++)
{
if (a[min] > a[j]) //如果后面有元素小于当前最小值
min = j; //将这个元素的下标赋值给min
}
if (i != min) //如果最小值已经发生变化,则交换元素
swap(&a[i], &a[min]);
}
}
接着我们来看一个例子,假设我们需要排序的数组为{12,56,80,91,20}
当 i = 0时,则设 a[i] = 12 = a[min],即 min = i,然后依次与后面元素进行比较,第一次比较,12<56,则 min 还是0;接着进行第二次比较,12<80,则当前min = i = 0;以此类推...
完成i = 0,此时数组为 a[5] = {12,56,80,91,20}
当 i = 1时,则 a[1] = 56 = a[min],然后循环比较,至最后一个元素20时,56>20,,此时min = 4,且 i!= min,则交换56 与 20的位置,得到序列{12,20,80,91,56}
此后以此类推完成排序,最后排序完成的序列为{12,20,56,80,91}.
如上图,简单选择排序就是,依次遍历,设置当前下标i为最小值min,即(min = i)此后循环之后的数据,如果后面的数据中有小于当前最小值的数据,就将这个数据的下标赋值给min,循环完一次之后,判断此时 min 与 i是否相等,若不等于则说明找到最小值,则交换当前 i下标对应元素 与 min 对应元素的值。
简单选择排序复杂度分析
简单选择排序的特点是交换次数少,从而节约了排序的时间。对于比较次数,无论情况最好最坏,比较次数都是一样的,第i次排序,就需要n-i次比较,此时就需要比较
对于交换次数而言,最好的结果是交换次数为0,;最差的结果是需要交换n-1次。
总的时间复杂度就是O(n²),简单选择排序与冒泡排序时间复杂度都为 O(n²),但是简单选择排序性能更佳。
部分图片参考:http://c.biancheng.net/view/3446.html