四大排序算法之GGBond版


前言

上了大学后,发现排序算法随处可见,只要是考C语言的,总会让你写几个排序算法。为了加深我的记忆以及对排序算法的理解,我整理了4种最容易理解的排序算法

一、排序算法是什么?

个人理解:排序算法就是为任意长度的数组由小到大排序(或者由大到小)的一种方法。

二、四大排序算法

交换函数

在写排序算法之前,首先先定义一个swap交换函数。

代码如下

/* 定义交换函数 */
void swap(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

1.冒泡排序

冒泡排序无疑是最简单的排序算法,通过多次的交换达到排序的目的 图解如下:

在这里插入图片描述

代码如下:
/* 冒泡排序 */
void BubbleSort(int* arr, int size)
{
	for (int i = size - 1; i > 0; i--)	/* 进行size-1个循环 */
		for (int j = 0; j < i; j++)		/* 每次需要交换i-1次 */
			if (arr[j] > arr[j + 1])	
				swap(&arr[j], &arr[j + 1]);	/* 将值大的元素通过交换持续后移 */
}

2.选择排序

选择排序就在整个数组元素中找到最小值然后替换到前面的方法 图解如下:

在这里插入图片描述

代码如下:

/* 选择排序 */
void SelectionSort(int* arr, int size)
{
	int small, flag;
	for (int i = 0; i < size - 1; i++)
	{
		small = i;
		flag = i;	/* flag作为标志一直后移,将值小元素互换到前面*/
		for (int j = i + 1; j < size; j++)
			if (arr[small] > arr[j]) small = j;	/* 搜寻值小元素的下标 */
		swap(&arr[small], &arr[flag]);	/* 将值小元素与flag元素互换 */
	}
}

3.插入排序

话不多说图解

在这里插入图片描述

代码如下:
/* 插入排序 */
void InsertionSort(int* arr, int size)
{
	int flag;
	for (int i = 1; i < size; i++)
	{
		int j = i - 1;
		flag = arr[i];		/* flag为插入元素 */
		while (j >= 0 && flag < arr[j])		/* 搜寻flag插入位置 */
		{
			arr[j + 1] = arr[j];
			j--;
		}
		arr[j + 1] = flag;		/* 将flag插入到合适位置 */
	}
}

4.快速排序

快速排序个人认为是这四大排序中最难的一种,但是从名字就可以知道它是最快的一种,它用到了递归算法,将数组通过几次分段,得到最后的正序数组 下来看图解吧!

在这里插入图片描述

/* 快速排序 */
void QuickSort(int* arr, int began, int end)
{
	if (began < end)		/* 递归结束的标志 */
	{
		int flag = arr[began];	/* 以第一个元素为flag */
		int i = began;
		int j = end;
		while (i < j)
		{
			while (i < j && flag < arr[j])
				j--;				/* 尾部开始搜寻小于flag的元素 */
			arr[i] = arr[j];
			while (i<j && flag>arr[i])
				i++;				/* 头部开始搜寻大于flag的元素 */
			arr[j] = arr[i];
		}						
		arr[i] = flag;			/* 将flag位置固定 */
		QuickSort(arr, began, i - 1);
		QuickSort(arr, i + 1, end); /* 将数组分为两段,同理递归 */
	}
}

总结

排序算法真的特别重要,我觉得这四种排序应该是最基础的 大家一起加油吧!😀
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值