C语言一维数组的排序问题

一维数组的排序问题

1.起(冒)泡法排序

就是每次相邻两个数排序,然后进行对调
类似于这种
在这里插入图片描述

0 2 4 5 8 9
#include <stdio.h>
void main ()
{
	int a[6]={9,5,0,4,2,8},i,j,t;
	for(j=0;j<6;j++)
		for(i=0;i<6-j;i++) \\内部的调动,每一次都会变动;注意内部变动的时候与j无关
			if (a[i]>a[i+1])    重点与j无关
			{t=a[i];a[i]=a[i+1];a[i+1]=t;}
	for(i=0;i<6;i++)  \\对于数组打印的时候都要用一个for循环来一个一个输出
	printf ("%d ",a[i]); \\由于变动的时候都是i的位置在变动,所以打印a[i]
}

对于数组的输出要用一个循环语句,因为数组是一串字数字,直接用printf语句是输不出的,而用一个循环语句是一个一个输出;

2.选择法排序

其实就是先确定一个最小值(记序号,通常是把第一个作为最小值),然后对下面的进行挑选,看是否有比最小的还小的数,如果有就换位置,没有就不动,确定它的位置了(把它剔除),进行下一组,在确定下一组的循环第一个为最小值;

0 2 4 5 8 9
来敲程序了
#include <stdio.h>
void main ()
{
	int a[6]={9,5,0,4,2,8},i,j,m;
	for(j=0;j<5;j++) \\j<5/6都行,但<5就少循环一次,j<6就是j=5下面就是自己和自己比了
	{	m=j; //记m为最小值
		for(i=j+1;i<6;i++) |
			if (a[m]>a[i]) |这三行是一个整体,做完在执行下一个,其实就是挑出最小值
				m=i;       |如果if不成立,m仍然为j;
		if (m!=j) \\这其实就紧接着上面,看m代表最小值发生了改变没,发生了就change
		{t=a[m];a[m]=a[j];a[j]=t;}  }
	for(j=0;j<6;j++) 
	printf ("%d ",a[j]);
}

如果你想由大到小排序,只需改变一步
if (a[m]>a[i]) 改为 if (a[m]<a[i]) 在这m所记的是最大值,嘻嘻

3.插入法排序

插入法没有上面两种好理解,耐着性子来吧;其实插入就是把一个数插到有序数列中去,比较时,从有序数列的后面往前比,直到找到插入点,且插入点之后的数都往后移一个,为了保证插入点之后往后移,咱们写程序的时候要预留位置,就是不满足条件时,数都往后移一位;
咱们通常就是一串乱的数据,而写程序的时候如何实现有序和无序的衔接呢,来用解释一下了,嘻嘻。
在这里插入图片描述
以此类推下去
写的有点乱,请多多谅解

0 2 4 5 8 9  运行结果
#include <stdio.h>
void main ()
{
	int a[6]={9,5,0,4,2,8},i,j,t; \\由小到大排序
	for(j=1;j<6;j++) \\控制外循环,并且是每插入一个数一次循环
	{	t=a[j];  \\待插入的数
		for(i=j-1;i>=0&&t<a[i];i--) \\负责找到插入点,然后结束内循环,注意是<
			a[i+1]=a[i]; \\控制往后移,直到找到插入点跳出
		a[i+1]=t;\\这时的i+1是由循环条件控制的,并不一定是i=0
	}
	for(j=0;j<6;j++) 
	printf ("%d ",a[j]);
}

其实刚开始的时候,我以为插入就是比较大小交换位置,代码如下,就一部分不同,运行结果并不错,但似乎运行有点慢。

#include <stdio.h>
void main ()
{
	int a[6]={9,5,0,4,2,8},i,j,m,t;
	for(j=1;j<6;j++)
	{	t=a[j];
		for(i=j-1;i>=0&&t<a[i];i--)
			{m=a[i];     |
			a[i]=a[i+1]; |就这三行不同
			a[i+1]=m;}   |
	}
	for(j=0;j<6;j++) 
	printf ("%d ",a[j]);
}
  • 14
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值