//排序--选择排序法
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

/*
选择排序(Selection sort)是一种简单直观的排序算法。
它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,
存放在序列的起始位置,直到全部待排序的数据元素排完。
选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。



选择排序 创建一个有序数组A,
第一步:找出无序数组B中的最小的元素  把他放置在有序数组A的第一个位置,从无序数组B中将该元素删除
第二步:继续找出无序数组B中的最小的元素  把他放置在有序数组A的第二个位置,从无序数组B中将该元素删除

选择排序&冒泡排序&插入排序:

选择排序每一轮都会遍历无序数组一遍,
插入排序每一轮都会遍历有序数组一遍,
冒泡排序不存在有序数组和无序数组的概念,只是通过相邻元素的交换 将最值元素放到数组的一端
*/

//选择法排序
void SelectionSort(int * arr, int num){
    if (arr==NULL)
    {
        printf("传入参数不可以为空!\n");
        return;
    }
    int i = 0, j = 0,k=0,temp=0;
    for (i = 0; i < num; i++)
    {
        //假设k是最小元素的下标
        k = i;
        for (j = i+1; j < num; j++)
        {
            //k初始化为0  当j=1是 正好是arr[0] vs arr[1]  没有漏掉任何一个元素
            if (arr[j]<arr[k])
            {
                //发现比下标为k的元素 更小的元素  改变k的值
                //改变之后  k这个下标的元素现在是最小的了
                k = j;
            }
        }
        //交换最小元素和第0个元素的值---一轮循环完了再进行交换
        if (k != i)
        {
            temp = arr[i];
            arr[i] = arr[k];
            arr[k] = temp;
        }
    }
}

//打印数组
void Print(int * arr,int num){
    if (arr == NULL)
    {
        printf("传入参数不可以为空!\n");
        return;
    }
    int i = 0;
    for (int i = 0; i < num; i++)
    {
        printf("%5d", *(arr + i));
    }
    printf("\n");
}

void Test(){
    int i = 0;
    int arr[10] = { 0 };
    //定义时间类型变量
    time_t ts;
    //生成随机数种子
    srand((unsigned int)time(&ts));
    for (i = 0; i < 10; i++)
    {
        arr[i] = (int)(rand() % 100);
    }
    //打印数组
    printf("\n原始数据----\n");
    Print(arr, 10);
    //选择法排序
    printf("选择法排序之后的数据\n");
    SelectionSort(arr, 10);
    Print(arr, 10);
}

void main(){
    Test();
    system("pause");
}

数据结构 排序(选择排序)_选择排序