数据结构 简单选择排序(C语言实现)

时间:2022-12-20 22:06:16

       选择排序的基本思想:每一趟在n-i+1(i=1,2,3,…,n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。


算法思想

 

      第一趟简单选择排序时,从第一个记录开始,通过n-1 次关键字比较,从n 个记录中选出关键字最小的记录,并和第一个记录进行交换。

      第二趟简单选择排序时,从第二个记录开始,通过n-2 次关键字比较,从n -1个记录中选出关键字最小的记录,并和第二个记录进行交换。

      ......

      第i趟简单选择排序时,从第i个记录开始,通过n-i 次关键字比较,从n - i + 1个记录中选出关键字最小的记录,并和第i个记录进行交换。

      如此反复,经过n-1 趟简单选择排序,将第n-1 个记录排到位,剩下一个最小记录直接在最后,所以共需进行n-1 趟简单选择排序。


源代码

#include<stdio.h>
 
typedef int KeyType;
 
typedef struct
{
    KeyType key;
}RecordType;
 
void SelectSort(RecordTyper[],int length)     //简单选择排序
{
    
    int x;
    //假设待排序列有n个数,从第一个数开始依次与其后面的数比较,需要比较n-1次
    for (int i = 1; i <=length-1;i++)
    {
        int k = i;
        for (int j = i + 1; j <=length; j++) //j从2开始
        {
            if (r[j].key <r[k].key)
            {
                k = j;
            }
        }
        if (k != i)          //当r[j].key>=r[k].key将r[k]的值借助中间变量X与x[i]的值交换
        {
            x = r[i].key;              //r[i].key为最小数
            r[i].key = r[k].key; 
            r[k].key = x;
 
        }
    }
}
 
void ShowResult(RecordType*r,int length)       //输出结果
{
    for (int i = 1; i <=length; i++)
    {
        printf("%d\t", r[i]);
    }
}
int main()
{
    RecordType r[] = { 0, 8, 2, 9, 7, 3, 6, 4, 5, 1, 0 };
    int length = sizeof(r) / sizeof(r[0]) - 1;
    SelectSort(r, length);
    ShowResult(r,length);
    printf("\n");
    return  0;
}