今天给大家介绍的是选择排序:
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是一种不稳定的排序方法。
下面通过一个具体的实例来给大家介绍:
例:给定一组随机数{34,65,56,23,90,17},通过选择排序将其变为升序有序的序列。
分析如下:(1)首先,我们将无序序列存入数组中,以便对它进行操作。
(2)由于选择排序需要从待排序的数据元素挑选出最小的一个,所以需要我们对数组进行遍历。
(3)每遍历一次,找出最小的,需要放在序列的起始位置,需要我们对数组中的元素进行交换。
模拟排序过程:
原序列: 34 65 56 23 90 17
第一轮排序:17 65 56 23 90 34
第二轮排序:17 23 56 65 90 34
第三轮排序:17 23 34 65 90 56
第四轮排序:17 23 34 56 90 65
第五轮排序:17 23 34 56 65 90
总结:通过上述规律,不难发现,每对数组进行一次遍历,我们便能从中找到最小的一个,将其放在序列的起始位置,由此我们可知,对于n个数,我们只需要进行n-1次数组遍历即可(最后一个数字已确定,不用再进行遍历),而每次遍历,如果最小的一个元素没有在起始位置,我们需要借助中间变量将最小的元素与当前起始位置的元素进行交换。
代码如下:
#include<stdio.h>
#include<stdlib.h>
//选择排序:每一趟从待排元素中选出最小(大)的元素
void selectionSort(int a[],int n)
{
for(int i=0;i<n-1;i++) //外循环控制循环轮数 即需要几次完成排序
{
int temp=0;
int min=i; //每轮假定第一个待排元素为最小的元素
for(int j=i+1;j<n;j++)
{
if(a[min]>a[j]) //将最小的标记出来,不执行交换
min=j;
}
//判断最小的是否是自己
if(min!=i)
{
temp=a[min];
a[min]=a[i];
a[i]=temp;
}
}
}
int main(void)
{
int a[6]={34,65,56,23,90,17};
selectionSort(a,6);
printf("经过选择排序后的结果为:");
//输出
for(int i=0;i<6;i++)
{
printf("%3d",a[i]);
}
}