C语言学习之选择排序

  上一篇文章中讲C语言排序中的比较常见的(交换)冒泡排序,那么这篇文章也将以新手个人的经历来讲同样比较常见而实用的数组排序之选择排序。

  选择排序,从字面上看是通过选择来进行排序。其实它的用法就是通过选择来进行排序的,我就以从小到大为例。设定一个临时的变量用来储存当前的最小值,如对第一位上该放置最小的数值,那么我要将第一位上的数值与后面位上的数进行值的比较,如果有比较的值比该数值小时则通过temp这个临时变量进行两值的交换,然后继续将交换后的值与剩下的数进行比较,如还有更小的值则继续交换值,否则不交换。这样依次比较到最后一位时就把第一位上该放置的数值找出来了,后面第二位、第四位......同理的操作。
  我还是以  4  6  32  5  12  2  15  28  9  10  这10个数为例进行选择排序,过程如下图

(方框中的数值则表示当前要排序位置上的数值)

  代码如下:

#include"stdio.h"
//传统交换法
int main(void)
{
    int i, j;
    int temp, min;
    int a[10] = {4, 6, 32, 5, 12, 2, 15, 28, 9, 10};
    for(j = 0; j < 10; j ++){
        for(i = j + 1; i < 10; i ++){//从要进行排序位上的数值开始 与后面的数值依次进行比较 
                      //如有比其值小的则进行值的交换 然后继续比较下去 若还有值比其小的继续进行值的交换 
                      //否则不进行
                if(a[j] > a[i]){
                    temp = a[i];
                    a[i] = a[j];//通过临时变量进行值的交换操作
                    a[j] = temp;
                }
            }
    }
        for(i = 0; i < 10; i ++)//打印输出
            printf("%d ", a[i]);
}

  由上图和代码,可以看出这个数值交换有点频繁,想要一次完成怎么办呢,那么就要进行优化了。就像下面这样的思路,运用擂台法从数组中直接找出符合条件的值然后进行值的交换,一次就搞定了。

  代码如下:

#include"stdio.h"
//交换法
int main(void)
{
    int i, j;
    int temp, min;
    int a[10] = {4, 6, 32, 5, 12, 2, 15, 28, 9, 10};
    for(j = 0; j < 10; j ++){
        for(i = j; i < 10; i ++){
                min = a[j];//采用擂台法找出最小值 首先假定要排序的数位上的值为最小值 然后找出最小值
                if(a[i] < min){
                    temp = a[i];
                    a[i] = min;
                    min = temp;
                }
                a[j] = min;//将最小的值与该位进行交换
            }
    }
        for(i = 0; i < 10; i ++)//打印输出
            printf("%d ",a[i]);
}

  同样的和(冒泡)交换排序一样,此排序方法仅是适用于小数据的排序,对于大量的数据可以巧妙地运用其它方法综合。希望本篇文章对你有所帮助,如你有更好的思路或者不懂 之处可在文章后留言。本文并非无错误之处,为博主个人总结而出,如有什么错误之处可联系博主。

原文地址:https://www.cnblogs.com/notfound/p/8377067.html