//排序--选择排序法
#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");
}