数据结构学习(十四)——选择排序

来源:互联网 发布:方向余弦矩阵微分方程 编辑:程序博客网 时间:2024/06/06 03:13

前篇的插入排序算法,为了给插入元素空出位置,经常要后移腾出位置而进行大量后移操作,如果是移动数据元素规模大的话,就会耗时降低效率。

插入排序操作特点:先确定排序对象,再确定插入位置。

选择排序操作特点:先确定排序位置,再确定排序对象。

选择排序大概流程就是从第一个元素开始,然后与后面的元素依次比较大小,比当前元素小的话就记下当前最小位置,继续比较,直到这轮比较完毕,这样就可以找出这一轮最小的元素,然后把此最小元素放入第一个元素位置。然后从第二个元素开始,继续上面的操作。最后就能排好序。

下面的代码实现了选择排序的操作练习。

#include <stdio.h>#define MAXSIZE 50void 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。

选择排序不同于插入排序,只能用于静态排序。