简简单单的选择排序(2)

简单选择排序算法

简单选择排序(Simple Selection Sort)就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换之。

运行示例:在这里插入图片描述

选择排序

/* 对顺序表L作简单的选择排序*/
#include <stdio.h>
#define MAXSIZE 10

typedef struct
{
    int r[MAXSIZE];
    int length;
}SqList;
void swap(SqList *L, int i, int j)
{
    int temp = L->r[i];
    L->r[i] = L->r[j];
    L->r[j] = temp;
}
void SelectSort(SqList *L)
{
    int i, j, min;
    for(i = 1; i < L->length; i++)
    {
        min = i;  //将当前下标定义为最小值下标
        for(j = i+1; j <= L->length; j++)  //循环之后的数据
        {
            if(L->r[min] > L->r[j]) //如果有小于当前最小值的关键字
            {
                min = j;   //将此关键字的下标赋值给min
            }
        }
        if(i != min)  //若min不等于i,说明找到最小值,交换
        {
            swap(L, i, min); //交换r[i] 与 r[min]的值
        }
    }
}
int main()
{
    SqList H;
    int n;
    
    scanf("%d",&n);
    H.length = n;
    for(int i = 1; i <= n; i++)
    {
        scanf("%d",&H.r[i]);
    }
    SelectSort(&H);
     for(int i = 1; i <= n; i++)
    {
        printf("%d ",H.r[i]);
    }
}
/*
------------------
程序运行示例:
9 
9 1 5 8 3 7 4 6 2
1 2 3 4 5 6 7 8 9 %  
------------------
*/

最多经过八次交换,就可完成排序工作

简单选择排序复杂度分析

分析一下它的复杂度。它最大的特点就是交换移动数据次数相当少,这样也就节约了相应的时间。无论最好还是最差的情况,其比较次数都是一样的多,第i趟排序需要进行n-i次关键字的比较,此时需要比较 i = 2 n ( i 1 ) \sum_{i=2}^n {(i-1)} = n ( n 1 ) 2 \frac{n(n-1)}{2} 次。而对交换次数而言,当最好的情况下,也就是要排序的表本身就是有序的,交换为0次,当最坏的情况,即待排序是逆序的情况,此时需要比较n-1次。基于最终的排序时间是比较与交换的次数总和,因此,总的时间复杂度依然为O( n 2 n^2 )。

尽管与冒泡排序同为O( n 2 n^2 ),但简单选择排序的性能上还是要略优于冒泡排序。

猜你喜欢

转载自blog.csdn.net/qq_43656353/article/details/106149449