前篇的插入排序算法,为了给插入元素空出位置,常常要后移腾出位置而进行大量后移操做,若是是移动数据元素规模大的话,就会耗时下降效率。算法
插入排序操做特色:先肯定排序对象,再肯定插入位置。数组
选择排序操做特色:先肯定排序位置,再肯定排序对象。code
选择排序大概流程就是从第一个元素开始,而后与后面的元素依次比较大小,比当前元素小的话就记下当前最小位置,继续比较,直到这轮比较完毕,这样就能够找出这一轮最小的元素,而后把此最小元素放入第一个元素位置。而后从第二个元素开始,继续上面的操做。最后就能排好序。对象
下面的代码实现了选择排序的操做练习。排序
#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]; } } }
该算法主要两部分组成,一种是比较操做,一种是交换操做,进行一次交换操做至关于进行三次移动操做。但工做量仍是比一次比较操做工做量小。该算法主要工做量为内层循环的比较操做。get
选择排序也只须要一个备用单元,即数组下标为0的元素和3个辅助变量i,j,k。io
选择排序不一样于插入排序,只能用于静态排序。class