C++数据结构与算法笔记(3)

本文详细介绍了四种基本排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体实例和代码实现展示了每种算法的工作原理及其优化方法。

一.冒泡排序

冒泡排序的理解就在于冒泡,听起来就像鱼吐泡泡一样,其实确实有点像。冒泡排序就是循环每次冒出最大的那个值或者最小值,把它放在前面或者后面,下面举个简单的例子:

下面用代码实现:

//升序
void bubble_sort_up(int* arr, int len)
{
	//外循环要n-1次
	for (int i = 0; i < len - 1; i++)
	{
		//内循环要找大的往后面冒
		for (int j = 0; j < len - i - 1; j++)
		{
			//开始比较往后挪,如果符合就往后冒
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
			
		}
		travel(arr, len);//每循环冒出一颗打印一次
	}
}

可以看到,每一层都冒出来最大的那个,那降序的写法呢,也是一样的:

//降序
void bubble_sort_down(int* arr, int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - i - 1; j++)
		{
			if (arr[j] < arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
		travel(arr, len);
	}
}

做一些小优化的写法:

//优化升序,降序同理
void bubble_sort(int* arr, int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		bool flag = false;
		for (int j = 0; j < len - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
				flag = true;
			}
			
		}
		if (!flag)
		{
			return;
		}
	}
}

二.选择排序

选择排序,顾名思义就是要选择,那如何选择呢?每次从待排数组中挑出最小或者最大的摆在相应的位置。这里我们需要和上面的冒泡排序区分一点的就是,选择排序在比较结束之后并不会直接交换两个元素的位置,只是记录当前序列中的最小元素 ,当找到最小的元素之后,在将该最小元素与队头的元素进行置换。

下面用代码实现:

//升序
void select_sort_up(int* arr, int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		//暂时把循环的第一个作为最大的
		//记录最小的那个的下标
		int minPos = i;
		for (int j = i; j < len-1; j++)
		{
			if (arr[j + 1] < arr[minPos])
			{
				minPos = j + 1;
			}
		}
		if (arr[i] > arr[minPos])
		{
			int temp = arr[i];
			arr[i] = arr[minPos];
			arr[minPos] = temp;
		}
		travel(arr, len);
	}
}

 降序写法也同理:(降序加优化,跟冒泡原理一样)

//降序
void select_sort_down(int* arr, int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		int maxPos = i;
		bool flag = false;
		for (int j = i; j < len - 1; j++)
		{
			if (arr[j + 1] > arr[maxPos])
			{
				maxPos = j + 1;
				flag = true;
			}
		}
		if (!flag)
		{
			return;
		}
		if (arr[maxPos] > arr[i])
		{
			int temp = arr[i];
			arr[i] = arr[maxPos];
			arr[maxPos] = temp;
		}
		travel(arr, len);
	}
}

三.插入排序

插入排序就是每次把待排数组中第一个插入到已序数组中。

下面用代码实现:

//升序
void insert_sort_up(int* arr, int len)
{
	for (int i = 1; i < len; i++)
	{
		int temp = arr[i];
		int insertPos = i;
		//找插入位置
		for (; insertPos > 0 && arr[insertPos - 1] > temp; insertPos--)
		{
			arr[insertPos] = arr[insertPos - 1];
		}
		//找到后插入
		arr[insertPos] = temp;
		travel(arr, len);
	}
}

降序也是同理:关键就是要找到插入位置

//降序
void insert_sort_down(int* arr, int len)
{
	for (int i = 1; i < len; i++)
	{
		int temp = arr[i];
		int insertPos = i;
		for (; insertPos > 0&& arr[insertPos - 1] < temp; insertPos--)
		{
			arr[insertPos] = arr[insertPos - 1];
		}
		arr[insertPos] = temp;
		travel(arr, len);
	}
}

四.希尔排序

希尔排序是升级版的插入排序,只是比插入排序多了一个步骤:确定步长。

下面是实现代码:

//升序
void shell_sort_up(int* arr, int len)
{
	//确定初始步长
	int step = len >> 1;
	for (; step > 0; step >>= 1)
	{
		//每次把下标为i的数插到已序数组里
		for (int i = step; i < len; i++)
		{
			//临时存储待插数据
			int temp = arr[i];
			int insertPos = i - step;
			//开始找插入位置,也就是插入排序的代码
			for (; insertPos >= 0 && arr[insertPos] > temp; insertPos -= step)
			{
				arr[insertPos + step] = arr[insertPos];
			}
			//找到后插入
			arr[insertPos + step] = temp;
		}
		travel(arr, len);
	}
}

 

降序也是同理:

//降序
void shell_sort_down(int* arr, int len)
{
	int step = len >> 1;
	for (; step > 0; step >>= 1)
	{
		for (int i = step; i < len; i++)
		{
			int temp = arr[i];
			int insertPos = i - step;
			for (; insertPos >= 0 && arr[insertPos] < temp; insertPos -= step)
			{
				arr[insertPos + step] = arr[insertPos];
			}
			arr[insertPos + step] = temp;
		}
		travel(arr, len);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值