数组的排序算法,你,都知道吗?

在这里插入图片描述


数组是一组有序数据的集合。
”有序“指的是数组元素在内存中的存放方式是有序的,其引用方式也有规律可循,而不是说数据元素在数组中是按照数值大小有序排列的。

1.选择法排序

每次在待排序数组中查找最大或最小的数组元素,将其值与最前面没有进行过排序的数组元素的值进行互换。由大到小排序应查找最大值,由小到大排序应查找最小值。

#include<stdio.h>
int main()
{
	int i, j;
	int a[10];		//定义数组,存储元素输入的10个数
	int iTemp;		//定义变量,表示最小的数组元素
	int iPos;		//定义变量,表示元素位置
	printf("为数组元素赋值:\n");
	for (i = 0; i < 10; i++)//输入十个数,为数组元素赋值
	{
		printf("a[%d]=", i);
		scanf("%d", &a[i]);
	}
	/*使用选择法对数组元素从小到大排序*/
	for (i = 0; i < 9; i++)//设置外层循环下表为0~8
	{
		iTemp = a[i];//假设当前为最小元素
		iPos = i;//记录最小元素位置
		for (j = i + 1; j < 10; j++)//设置内层循环下表为i+1~9,表示剩下的未排序数组元素
		{
			if (a[j] < iTemp)
			{
				iTemp = a[j];//重新设定最小值
				iPos = j;//修正最小元素位置
			}
		}
		a[iPos] = a[i];//互换元素
		a[i] = iTemp;
	}
	printf("排序结果如下:\n");
	for (i = 0; i < 10; i++)
	{
		printf("%d\t", a[i]);
		if (i == 4)
			printf("\n");
	}
	printf("\n");
	return 0;
}

2.冒泡法排序

每次比较数组中相邻的两个数组元素的值,将较小的数排在较大的数前面,可实现数组元素从小到大排序;每次将较大的数排在较小的数前面,可实现数组元素从大到小排序。


#include<stdio.h>
int main()
{
	int i, j;
	int a[10];		//定义数组,存储元素输入的10个数
	int iTemp;		//定义变量,表示最小的数组元素
	int iPos;		//定义变量,表示元素位置
	printf("为数组元素赋值:\n");
	for (i = 0; i < 10; i++)//输入十个数,为数组元素赋值
	{
		printf("a[%d]=", i);
		scanf("%d", &a[i]);
	}
	/*使用冒泡法对数组元素从小到大排序*/
	for (i = 1; i < 10; i++)//设置外层循环下表为1~9,表示后九个元素
	{
		for (j = 9; j > i; j--)//设置内层循环下表为9~i,表示最后一个元素开始向前循环
		{
			if (a[j] < a[j-1])//如果前一个数比后一个数大
			{
				iTemp = a[j-1];
				a[j-1] = a[j];
				a[j] = iTemp;
			}
		}//交换两个数组元素的值,使小数前移,如同冒泡
	}
	printf("排序结果如下:\n");
	for (i = 0; i < 10; i++)
	{
		printf("%d\t", a[i]);
		if (i == 4)
			printf("\n");
	}
	printf("\n");
	return 0;
}

3.交换法排序

交换法排序是将每一位数于其后的所有数一一比较,如果发现符合条件的数据,则交换数据。

#include<stdio.h>
int main()
{
	int i, j;
	int a[10];		//定义数组,存储元素输入的10个数
	int iTemp;		//定义变量,表示最小的数组元素
	int iPos;		//定义变量,表示元素位置
	printf("为数组元素赋值:\n");
	for (i = 0; i < 10; i++)//输入十个数,为数组元素赋值
	{
		printf("a[%d]=", i);
		scanf("%d", &a[i]);
	}
		/*使用交换法对数组元素从小到大排序*/
	for (i = 0; i < 9; i++)//设置外层循环下表为0~8,表示前九个元素
	{
		for (j = i+1; j < 10; j++)//设置内层循环下表为i+1~9,表示后面待比较的元素
		{
			if (a[j] < a[i])//如果前一个数比后一个数大
			{
				iTemp = a[i];
				a[i] = a[j];
				a[j] = iTemp;
			}
		}//交换两个数组元素的值
	}
	printf("排序结果如下:\n");
	for (i = 0; i < 10; i++)
	{
		printf("%d\t", a[i]);
		if (i == 4)
			printf("\n");
	}
	printf("\n");
	return 0;
}

4.插入法排序

插入法排序较为复杂,其基本原理是:抽出一个数据,在前面的数据中寻找相应的位置插入,然后继续下一个数据,直接完成排序。

#include<stdio.h>
int main()
{
		int i, j;
		int a[10];		//定义数组,存储元素输入的10个数
		int iTemp;		//定义变量,表示最小的数组元素
		int iPos;		//定义变量,表示元素位置
		printf("为数组元素赋值:\n");
		for (i = 0; i < 10; i++)//输入十个数,为数组元素赋值
		{
			printf("a[%d]=", i);
			scanf("%d", &a[i]);
		}
			/*使用插入法对数组元素从小到大排序*/
		for (i = 1; i < 10; i++)//设置外层循环下表为1~9,表示前九个元素
		{
			iTemp = a[i];//设置插入值
			iPos = i - 1;
			while ((iPos >= 0) && (iTemp < a[iPos]))//内层循环,寻找插入的位置
			{
				a[iPos + 1] = a[iPos];//插入数值
				iPos--;
			}
			a[iPos] = iTemp;
		}
		printf("排序结果如下:\n");
		for (i = 0; i < 10; i++)
		{
			printf("%d\t", a[i]);
			if (i == 4)
				printf("\n");
		}
		printf("\n");
		return 0;
	}

5.折半法排序

折半法排序又称为快速排序,其基本原理为:选择一个中间值(在程序中使用数组中间元素的值,然后把中间值小的元素放在左边,比中间值大的元素放在右边(具体的实现是从两边查找,找到一对后进行交换),然后再对左右两边分别递归使用折半法排序过程。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵远疴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值