选择排序示例及简析

本文介绍选择排序法的示例及简要分析。

示例代码如下:

 

#include 
#include 

int main()
{
    /* 选择排序法函数声明 */ 
    int sort(int array[], int n);
    
    int num[5] = {0};
    int i = 0;
    
    /* 接收用户输入的5个整型数 */
    printf("please input 5 integer numbers: \n");
    for (i = 0; i < 5; i++)
    {
        scanf("%d", &num[i]);
    }
    
    /* 使用选择排序法进行排序 */
    i = sort(num, 5);
    
    /* 打印排序后的数字顺序(由小到大) */
    printf("the sorted numbers: \n");
    for (i = 0; i < 5; i++)
    {
        printf("%d ", num[i]);
    }
    
    printf("\n");
     
    system("pause");
    
    return 0;
}

/* 
*  选择排序法的函数定义
*  数组array存放待排序数字
*  n表示数组array大小 
*/
int sort(int array[], int n)
{
    int i;
    int j;
    int k;
    int tmp;
    
    /* n个数字进行排序,共需要进行n-1趟比较。此处i的取值从0到n-1,共n-1趟 */ 
    for (i = 0; i < n - 1; i++)
    {
        /* 将当前位置的数字赋值给array[k] */ 
        k = i;
        for (j = i + 1; j < n; j++)
        {
            if (array[j] < array[k])
            {
                /* 取出当前位置及之后的数字(待排序数字)中最小的值,赋值给array[k] */
                k = j;
            }
        }
        /* 待排序数字中最小的值array[k]与array[i]对换,保证array[i]是待排序数字中最小的数 */
        tmp = array[k];
        array[k] = array[i];
        array[i] = tmp;
    }
    
    return 0;
}

上述代码的运行结果如下:

 

 

please input 5 integer numbers:
-11 92 -22 0 100
the sorted numbers:
-22 -11 0 92 100

从上述代码及其运行结果,能够得出:

 

a)所谓选择排序法就是先将n个数中最小的数与array[0]对换;再将剩余n-1个数(即array[1]到array[n-1])中最小的数与array[1]对换...每比较一趟,都会找出一个未经排序的数中最小的一个数字,然后选择该数字,将其与待排序数字的首个数字进行对换

b)n个数使用选择排序法进行排序,共需进行n-1趟排序。

说明:由于上述选择排序函数形参使用的是数组名,在调用该函数时,是把实参数组的首元素地址传递给形参数组,这样两个数组就共占同一段内存单元了,所以被调函数中形参数组的改变也导致了实参数组随之改变。

—————————————— 分割线 ———————————————

补充:

本例是通过数组名作为函数实参的方法,实现的选择排序算法。用数组名作函数实参时,不是把数组元素的值传递给形参,而是把实参数组的首元素地址传递给形参数组,这样两个数组就共占同一段内存单元了,也就是说,形参数组中各元素的值如果发生变化,也会使实参数组元素的值同时发生变化(这一点与变量作为函数参数是不相同的)。在程序设计中可以有意识地利用这一特点改变实参数组元素的值(如排序)。

你可能感兴趣的:(算法)