[c语言]总结选择排序的一些细节
1.求解前需知
对于一组乱序的数字,c语言的通常解决方法有两种,冒泡排序和选择排序。本文介绍选择排序。
(冒泡排序在上篇文章中,需要的点击这里:[c语言]总结冒泡排序的一些细节)
2.选择排序
①名词解释:
顾名思义,选择排序就是在一组含有n个无序的数字中选择出来一个最小值与第一个元素进行交换,所以要交换n-1个回合(因为倒数第二个数字选择结束后,最后一个数字,也就是最大数就到了最后一位。)外循环控制总选择回合。
每一回合进行选择时,其实都是第一个数字与后面每个数字进行比较,根据c语言数组的定义,数组下标不可越界。举一个例子:
6个数字组成的数组a[6],数组下标的范围是从a[0]到a[5],那么我们固定第一个数字a[0],让它与剩下的a[1]到a[5]进行比较,就要比较5回合,因为是从a[1]开始的,所以内循环的循环变量j正好小于6(也是小于等于5),即为数字的个数。理论存在,代码走起。
for(i=0;i<n-1;i++)
{
p = i;
for(j=i+1;j<n;j++)
{
if(a[j]<a[p])
{
temp=a[j];
a[j]=a[p];
a[p]=temp;
}
}
}
②代码解释:
p=i,是将每一回合的第一个数赋值给p(也就是假想p为最小值),这样方便每一次循环比较。
若要将所以数中的最大数放到前面,形成倒序排的话,只需要将上述代码中的**a[j]<a[p]改成a[j]>a[p]**即可。
③动态图演示
3.选择排序分析
选择排序中,最理想的状况就是移动次数为0次,原来就是一组有序数,最复杂的情况就是一组倒序数,最小的数字在最后面,最多要移动3(n-1)次,6个数字就要移动30次。时间复杂度为O(n²)。
4.完整代码
#include<stdio.h>
int main()
{
int i,j,temp,a[666],n,p;
printf("输入需要排序的个数:\n");
scanf("%d",&n);
printf("输入需排序的%d个数字\n",n);
for(i=0;i<n;i++)
scanf("%d/t",&a[i]);
printf("`````````````````````````\n");
printf("显示未排序数字:\n");
for(i=0;i<n;i++)
printf("%4d",a[i]);
printf("\n");
for (i = 0; i < n-1; i++)//确定总选择回合
{
p = i;
for (j = i+1; j < n; j++)//每回合选择次数
{
if (a[j]<a[p])
{
//交换
temp = a[j];
a[j] = a[p];
a[p] = temp;
}
}
}
printf("显示排序完成后的数字:\n");
for(i=0;i<n;i++)
printf("%4d",a[i]);
printf("\n");
return 0;
}
如果看到这里感觉有帮助的话,请给土豆哥点个赞哦,嘻嘻!!!