简单选择排序算法原理:每次从左至右扫描序列,记下最小值的位置。
设所排序序列的记录个数为n。i取1,2,…,n-1,从所有n-i+1个记录(Ri,Ri+1,…,Rn)中找出排序码最小的记录,与第i个记录交换。执行n-1趟 后就完成了记录序列的排序。
//不稳定,时间复杂度O【n^2】
//时间复杂度略优于冒泡,但是不稳定。
//不是一个很好的排序算法。
/*****************************
简单选择排序
*****************************/
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
# include <algorithm>
struct Arr
{
int * pBase;
int length;;
};
void create_Arr(struct Arr *, int);
void sim_sort(struct Arr *);
void out_arr(struct Arr *);
int main(void)
{
int val, num;
struct Arr Arr;
printf ("输入数组的个数");
scanf("%d", &num);
create_Arr(&Arr, num);
for (int i = 0; i<num; i++)
{
printf ("第%d个数为\n", i+1);
scanf("%d", &Arr.pBase[i]);
}
out_arr(&Arr);
sim_sort(&Arr);
out_arr(&Arr);
printf("%d",Arr.length);
return 0;
}
void create_Arr(struct Arr * p, int len)
{
p->pBase = (int*)malloc(sizeof(int)*len);
if (p->pBase == NULL)
{
printf("数组创建失败");
exit(1);
}
p->length = len;
return;
}
void sim_sort(struct Arr * p)
{
int i, j, min, t;
for (i = 0; i<p->length; i++)
{
min = i;
for (j = i + 1; j < p->length; j++)//这里是j < p->length没有等于,垃圾教材瞎jb乱写,有了等于会丢掉最大值,我找这个错找了两个小时,还是很开心的
{
if ((p->pBase[min])>(p->pBase[j]))
min = j;
}
if (i != min)
{
t = p->pBase[min];
p->pBase[min]=p->pBase[i] ;
p->pBase[i] = t;
}
}
}
void out_arr(struct Arr * p)
{
for (int i =0; i<p->length; i++)
printf("%d ", p->pBase[i]);
printf("\n");
return;
}
数据结构若是入门,个人强烈不推荐大话数据结构,反正我强烈不推荐。。