学科分类
目录
C语言

选择排序

选择排序的原理与冒泡排序不同,它是指通过每一趟排序过程,从待排序记录中选择出最大(小)的元素,将其依次放在数组的最前或最后端,最终实现数组的排序。接下来,以升序排列为例分步骤讲解选择排序的整个过程,具体如下。

第1步:在数组中选择出最小的元素,将它与0索引元素交换,即放在开头第1位。

第2步:除0索引元素外,在剩下的待排序元素中选择出最小的元素,将它与1索引元素交换,即放在第2位。

第3步:以此类推,直到完成最后两个元素的排序交换,就完成了升序排列。

根据上述步骤,选择排序的流程可使用图1描述。

图1 选择排序流程图(以升序排列为例)

同样以数组{9,8,3,5,2}为例,使用选择排序调整数组顺序的过程如图2所示。

图2 选择排序过程

在图2中,一共经历四轮循环完成数组的排序,每一轮循环的作用如下。

第1轮:循环找出最小值2,将它与第一个元素9进行交换。

第2轮:循环找出剩下的4个元素中的最小值3,将它与第二个元素8交换。

第3轮:循环找出剩下的3个元素中的最小值5,将它与第三个元素8交换。

第4轮:对最后两个元素进行比较,比较后发现不需要交换,则排序完成。

选择排序的代码如例1所示。

例1 selectSort.c

 1  #include <stdio.h>
 2  int main()
 3  {
 4    int arr[5] = { 9,8,3,5,2 };
 5    int i, j, temp, min;
 6    printf("排序之前:");
 7    for (i = 0; i < 5; i++)
 8      printf("%d\t", arr[i]);
 9    for (i = 0; i < 5 - 1; i++)    //外层循环控制比较的轮数
 10   {
 11     min = i;      //暂定i索引处的元素是最小的,用min记录其索引
 12     for (j = i + 1; j < 5; j++)   //内层循环在剩下的元素中找出最小的元素
 13     {
 14       if (arr[j] < arr[min])
 15         min = j;
 16     }
 17     if (min != i)         //交换两个元素的位置
 18     {
 19       temp = arr[i];
 20       arr[i] = arr[min];
 21       arr[min] = temp;
 22     }
 23   }
 24   printf("\n排序之后:");
 25   for (i = 0; i < 5; i++)
 26     printf("%d\t", arr[i]);
 27   return 0;
 28 }

例1的运行结果如图3所示。

图3 例1运行结果

点击此处
隐藏目录