前篇的插入排序算法,为了给插入元素空出位置,经常要后移腾出位置而进行大量后移操作,如果是移动数据元素规模大的话,就会耗时降低效率。
插入排序操作特点:先确定排序对象,再确定插入位置。
选择排序操作特点:先确定排序位置,再确定排序对象。
选择排序大概流程就是从第一个元素开始,然后与后面的元素依次比较大小,比当前元素小的话就记下当前最小位置,继续比较,直到这轮比较完毕,这样就可以找出这一轮最小的元素,然后把此最小元素放入第一个元素位置。然后从第二个元素开始,继续上面的操作。最后就能排好序。
下面的代码实现了选择排序的操作练习。
#include <stdio.h>
#define MAXSIZE 50
void Select_sort(int *s, int n);
int main(void)
{
int n, i;
int s[MAXSIZE + 1];
printf("选择排序练习:\n");
printf("输入想输入数据的个数:");
scanf("%d", &n);
getchar();
printf("依次输入想输入的数据\n");
for(i=1; i<=n; i++)
{
scanf("%d", &s[i]);
}
Select_sort(s, n);
printf("排序后的数据为:\n");
for(i=1; i<=n; i++)
{
printf("%d ",s[i]);
}
printf("\n");
return 0;
}
void Select_sort(int *s, int n)
{
int i, j, k;
for(i=1; i<=n; i++)
{
k = i; //假定当前元素为最小值
for(j=i+1; j<=n; j++)
{
if(s[j] < s[k])
{
k = j; //记录当前最小值的下标
}
}
if(k != i) //把真正最小元素值放入正确位置
{
s[0] = s[k];
s[k] = s[i];
s[i] = s[0];
}
}
}
选择排序的时间复杂度也跟数据多少成正比例,所以时间复杂度为O(n^2)
该算法主要两部分组成,一种是比较操作,一种是交换操作,进行一次交换操作相当于进行三次移动操作。但工作量还是比一次比较操作工作量小。该算法主要工作量为内层循环的比较操作。
选择排序也只需要一个备用单元,即数组下标为0的元素和3个辅助变量i,j,k。
选择排序不同于插入排序,只能用于静态排序。