排序算法——2简单选择排序算法

选择排序:

时间复杂度:无论什么数据排序,时间复杂度都是 O(n²) 。

优点:与冒泡排序相比,交换移动数据的次数相当少,每趟只交换一次,不占用额外的内存空间。

主要思路:从头至尾扫描序列,找出最小的一个元素后,和第一个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列。

算法过程举例:

原始序列:45,24,75,66,32

1)第一趟,将第一个数组元素45的下标赋给min,逐次与后面的元素比较,发现24比45小,则当前最小的元素为24,将24的数组下标赋给min,继续往后比较,发现整个序列中最小的元素是24,则将24与45交换;

a[0]=45,a[1]=24,min=0;a[0]>a[1],则min=1........min总是表示最小元素的下标,最后交换a[0]和a[min];

第一趟比较:{ 24},{45,75,66,32}    前面是排序好的序列,后面是未排序的序列

2) 第二趟,将第二个元素45的下标赋给min,逐次与后面元素比较,发现75比45大,则45仍然是最小元素,继续比较,最后发现32比45小,则32是当前序列最小元素,将32元素下标赋给min,最后将45与32交换;

a[1]=45,a[2]=75,min=1;a[1]<a[2],min=1..........a[4]=32,a[1]>a[4]=32,min=4,交换a[1]和a[4]

扫描二维码关注公众号,回复: 15511127 查看本文章

第二趟比较:{ 24,32},{ 75,66,45}

3)继续重复上述步骤,共进行N-1趟比较

原始序列 45 24 75 66 32 当前序列最小值24
第一趟比较 24 45 75 66 32 剩下序列最小值32
第二趟比较 24 32 75 66 45 剩下序列最小值45
第三趟比较 24 32 45 66 75 剩下序列最小值66
第四趟比较 24 32 45 66 75 排序完成

共进行N-i趟比较,每趟都是先找出最小元素,得到最小元素下标后,将其与未排序的第一个元素交换

具体程序:

#include<stdio.h>
void swap(int a[],int b[])  //将交换部分单独写成函数
{
    int temp=*a;
    *a = *b;
    *b = temp;
}

void selection_sort(int a[],int len)  //选择排序
{
    int i,j;
    for(i=0;i<len-1;i++)   //控制趟数
    {
        int min=i;    //将当前未排序元素的下标赋给min
        for(j=i+1;j<len;j++)  //找出未排序序列中最小元素的下标
        {
            if(a[j]<a[min])
                min=j;   //将当前最小元素下标赋给min
        }
        swap(&a[i],&a[min]);  //交换当前趟次比较找出的最小元素
    }}

int main()
{
    int i,m;
    int a[]={45,24,75,66,32};
    m=sizeof(a)/sizeof(a[0]); //计算数组元素的个数
    printf("排序前:");
    for(i=0;i<m;i++)
    {
        printf("%d ",a[i]);
    }
    selection_sort(a,m);
    printf("\n排序后:");
    for(i=0;i<m;i++)
    {
        printf("%d ",a[i]);
    }
    while(1);
}

运行结果:

猜你喜欢

转载自blog.csdn.net/Healer19/article/details/117440779