用C语言实现冒泡排序,插入排序,快速排序

本篇文章分别介绍三种排序方法,冒泡排序,插入排序,快速排序。

为了便于提高效率与阅读,借助rand()函数随机分配整数初始化与赋值给数组。

具体实现原理与过程请看代码,带有详细的注释,谢谢。

#include<stdio.h>
#include<stdlib.h>

// 公共函数
void PrintArray(int *pArray);
void CreateUnordered(int *pArray);

// 冒泡排序
void BubbleRank(int *pArray);
void CreateBubble(int *pArray);

// 快速排序
void CreateQucikRank(int *pArray);
void QuickRank(int *pArray, int Low, int High);
int FindPos(int *pArray, int Low, int High);

// 插入排序
void InsertRank(int *pArray);
void CreateInsertRank(int *pArray);


#define ArrayNum 10

int main()
{
	int Array[ArrayNum] = {0};

	// 创建冒泡排序
	CreateBubble(Array);
	
	// 创建快速排序
	CreateQucikRank(Array);

	// 创建插入排序
	CreateInsertRank(Array);

	while(1);
}

/*------------------------公共函数----------------------------*/
/*
	函数名:CreateUnordered给数组元素变成无序 

	原理:通过时间来生成数据,为了便于观察,我们生成两位数的正数
*/
void CreateUnordered(int *pArray)
{
	int i = 0;
	int Temp = 0;
	while(i < ArrayNum)
	{
		Temp = rand();
		if(Temp < 100 && Temp > 9)
			pArray[i++] = Temp;
	}

	printf("无序数组元素:");
	for(i=0; i<ArrayNum; i++)
	{
		printf("%d ",pArray[i]);
	}
	printf("\n");
}

/*
	函数名:PrintArray打印数组元素 

	原理:通过while循环打印数组用的元素
*/
void PrintArray(int *pArray)
{
	int i = 0;
	for(i=0; i<ArrayNum; i++)
	{
		printf("%d ",pArray[i]);
	}
	printf("\n\n");
}


/*------------------------冒泡排序----------------------------*/
void CreateBubble(int *pArray)
{
	// 根据时间生成一个无序数组
	CreateUnordered(pArray);	

	// 调用冒泡排序函数
	BubbleRank(pArray);

	// 打印数组元素
	printf("After BubbleRank is:");
	PrintArray(pArray);
}

/*
	函数名:BubbleRank冒泡排序 

	原理:相邻的两个数相互比较,把较大的数放后面,用两个循环实现
*/
void BubbleRank(int *pArray)
{
	int i = 0, j = 0;
	int Temp = 0;

	for(i=0; i<ArrayNum-1; i++)
	{
		for(j=0; j<ArrayNum-i-1; j++)
		{
			if(pArray[j] < pArray[j+1])
			{
				Temp = pArray[j];
				pArray[j] = pArray[j+1];
				pArray[j+1] = Temp;
			}					
		}
	}
}


/*------------------------快速排序----------------------------*/
/*
	函数名:CreateQucikRank创建一个快速排序模块

	原理:由三部分组成:生成无序元素数组,调用快速排序,打印排序结果
*/
void CreateQucikRank(int *pArray)
{
	// 给数组无序排序
	CreateUnordered(pArray);

	// 快速排序
	QuickRank(pArray, 0, ArrayNum-1);

	// 打印排序之后的数组
	printf("After QuickRank is:");
	PrintArray(pArray);
}

/*
	函数名:QucikRank快速排序

	原理:通过递归调用FindPos
*/
void QuickRank(int *pArry, int Low, int High)
{
	if(Low > High)
		return;
	int Pos = FindPos(pArry, Low, High);

	QuickRank(pArry, Low, Pos-1);
	QuickRank(pArry, Pos+1, High);
}

/*
	函数名:FindPos 

	原理:把小于Temp的值放左边,大于Temp的值放右边
*/
int FindPos(int *pArray, int Low, int High)
{
	int Temp = pArray[Low];	

	while(Low < High)
	{	
		// 小于Temp的值放在左边
		while(Low < High && pArray[High] >= Temp)	
			High--;		
		pArray[Low] = pArray[High];	// 把pArray[High]的值放到左边

		// 大于Temp的值放在右边
		while(Low < High && pArray[Low] <= Temp)
			Low++;
		pArray[High] = pArray[Low];	// 把pArray[Low]的值放到右边
	}

	pArray[Low] = Temp;
	
	return Low;
}


/*------------------------插入排序----------------------------*/
/*
	函数名:CreateInsertRank创建插入排序函数 

	原理:由三部分组成
*/
void CreateInsertRank(int *pArray)
{
	// 给数组无序排序
	CreateUnordered(pArray);

	// 调用插入排序
	InsertRank(pArray);

	// 打印数组元素
	printf("After InsertRank is:");
	PrintArray(pArray);
}

/*
	函数名:InsertRank插入排序函数 

	原理:从第二个元素开始与前一个元素比较,较小的放前面,重复此过程
*/
void InsertRank(int *pArray)
{
	int i = 0;
	int j = 0;
	for(i=1; i<ArrayNum; i++)
	{
		j = i-1;
		int Temp = pArray[i];		// 获取插入数据
		while(pArray[j] > Temp && j>= 0)
		{
			pArray[j+1] = pArray[j];
			j--;
		}
		pArray[++j] = Temp;			// 插入到指定的位置
	}
}

输出结果为:

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值