八大经典排序算法(C语言)

这篇博客详细记录了编程初学者通过C语言实现的八大经典排序算法,包括冒泡排序、快速排序、选择排序、插入排序、归并排序、希尔排序、堆排序和基数排序,每种算法都有思想介绍、动图示意和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

一、冒泡排序

二、快速排序

三、选择排序

四、插入排序

五、归并排序

六、希尔排序

七、堆排序

八、基数排序(正整数)

参考资料


 

前言

        初学编程,记录一下八大经典排序算法,以便后续复习。参考借鉴了很多文章和代码,在本文末尾会进行标注,也在此对各位前辈表示感谢。

        本文记录的排序算法有:冒泡排序、快速排序、选择排序、插入排序、归并排序、希尔排序、堆排序、基数排序。相关描述均以升序排序为例。

 

一、冒泡排序

1、算法思想:

①从第1个元素开始,与后面相邻的元素进行比较,若前者大于后者,则两者交换;

②直至比较至最后一个元素,则经过第一轮比较后,末尾元素即为最大的元素;

③重复前面的步骤,第二轮比较至倒数第二个元素,得到第二大的元素,依次类推;

④每轮比较的元素越来越少,直至没有元素需要比较,即可得到升序序列。

2、动图示意(图源公众号:程序员乔戈里 https://mp.weixin.qq.com/s/6PMTtUtYUQxXRf4zWdoZkQ

示意图是从最后一个元素开始往前比较,依次确定前面的元素为比较序列的最小值,原理相同

3、代码实现(C语言)

#include <stdio.h>
#include <malloc.h>

void BubbleSort(int *a, int len); 

int main(void)
{
	int len, i;
	int * a;
	printf("请输入要排序的数的个数:");
	scanf("%d", &len);
	a = (int *) malloc (len * sizeof(int));  //动态构造数组 
	printf("请依次输入要进行升序排序的数:\n");
	for(i = 0; i < len; ++i)
	{
		scanf("%d", &a[i]);
	} 
	
	BubbleSort(a, len);  //调用排序函数 
	
	for(i = 0; i < len; ++i)
	{
		printf("%d  ", a[i]);
	}
	printf("\n");   //输出排序结果 
	
	return 0;
}

void BubbleSort(int *a, int len)  //核心代码:排序函数 
{
	int i, j, t;
	for(i = 0; i < len; ++i)
	{
		for(j = 0; j < len-i-1; ++j)
		{
			if(a[j] > a[j+1])   //两个数两个数比较,大的放后面,每一轮比较都能得到未排列数的最大值 
			{
				t = a[j];
				a[j] = a[j+1];  //借助临时变量t来进行两个数的交换,使得较大的数放在后面
				a[j+1] = t;
			}
		}
	}
}	

二、快速排序

1、算法思想:

①从数列中选出一个元素(通常选第一个元素)作为基准;

②所有比该数小的元素交换至其左边,比该数大的元素放在右边,一轮比较之后即可确定该基准元素在有序序列中的位置;

③至此该基准元素将数列划分为左右两个新的数列,对左右两个新数列进行步骤①②同样的处理,进一步确定其他元素的排序位置;

④用递归的方式,最终将所有的元素的位置确定下来,形成有序序列。

2、动图示意

示意图是以最后一个元素作为基准,原理相同,代码以第一个元素为基准。

3、代码实现

#include <stdio.h>
#include <malloc.h>

void QuickSort(int *a, int low, int high); 
int FindPos(int *a, int low, int high);

int main(void)
{
	int len, i;
	int * a;
	printf("请输入要排序的数的个数:");
	scanf("%d", &len);
	a = (int *) malloc (len * sizeof(int));  //动态构造数组 
	printf("请依次输入要进行升序排序的数:\n");
	for(i = 0; i < len; ++i)
	{
		scanf("%d", &a[i]);
	} 
	
	QuickSort(a, 0, len-1);  //调用排序函数
	
	for(i = 0; i < len; ++i)
	{
		printf("%d  ", a[i]);
	}
	printf("\n");   //输出排序结果 
	
	return 0;
}

void QuickSort(int *a, int low, int high)  //low和high分别表示数组下标的最小值和最大值 
{
	int pos; //变量表示第一个元素完成排序后对应的下标 
	
	if(low < high)
	{
		pos = FindPos(a, low, high);
		QuickSort(a, low, pos-1);  //用递归处理左右两边未排序的数 
		QuickSort(a, pos+1, high); //pos-1和pos+1对应high和low,相等则跳出递归 
	}	
}

int FindPos(int *a, int low, int high)  //该函数旨在找到每次快排时第一个元素的位置
 {
 	int v
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值