C++算法——基本的排序算法(插入、选择、冒泡、梳排序)

本文为作者学习笔记
欢迎交流讨论,喜欢的话点个赞吧

欢迎去看我的主页: NicholasYe’s Hompage.


插入排序

  • 原理:将一个元素放在合适的位置,并将其他的元素向前或向后一起移动一个位置

步骤:

  1. 从data[1]开始,因为只有一个元素的数组是已排序的
  2. temp存储data[i],用于将较小值放置于数组前方
  3. 从data[i]开始,以data[j]给data[j-1]赋值的方式向数列后方复制
  4. 结束条件:temp比data[j-1]大或者已经复制到数列最前方
  5. 替换较小的值
#include <iostream>
using namespace std;

void Insertation(int data[], int n, int way)
{
	//升序排序
	if (way == 0)
	{
		//从data[1]开始,因为只有一个元素的数组是已排序的
		for (int i = 1, j; i < n; i++)
		{
			//temp存储data[i],用于将较小值放置于数组前方
			int temp = data[i];

			//从data[i]开始,以data[j]给data[j-1]赋值的方式向数列后方复制
			//结束条件:temp比data[j-1]大或者已经复制到数列最前方
			for (j = i; j > 0 && temp < data[j - 1]; j--)
				data[j] = data[j - 1];

			//替换较小的值
			data[j] = temp;
		}
	}
	//降序排序
	else if (way == 1)
	{
		for (int i = 1, j; i < n; i++)
		{
			int temp = data[i];
			for (j = i; j > 0 && temp > data[j - 1]; j--)
				data[j] = data[j - 1];
			data[j] = temp;
		}
	}
}

int main()
{
	//定义数组大小
	const int Num = 20;

	int Arr[Num] = { 92,57,42,69,89,16,24,44,52,11,73,9,45,3,64,29,87,26,78,31 };
	cout << "排序前:";
	for (int i = 0; i < Num; i++)
		cout << Arr[i] << " ";
	cout << endl;

	//升序排序
	Insertation(Arr, Num, 0);
	cout << "排序后:";
	for (int i = 0; i < Num; i++)
		cout << Arr[i] << " ";
	cout << endl;

	//降序排序
	Insertation(Arr, Num, 1);
	cout << "排序后:";
	for (int i = 0; i < Num; i++)
		cout << Arr[i] << " ";
	cout << endl;

	system("pause");
	return 0;
}


选择排序

  • 原理:从头开始,搜寻数组里面的最小值,并将它放在最小的位置

步骤:

  1. 对第i个数字进行替换
  2. 在i后面的数字中进行搜寻,搜索更小的数字,并进行替换

改进策略:
如果该值与最小值不相同则交换(此步骤可以减小交换/赋值次数)

#include <iostream>
using namespace std;

void Selectionsort(int data[], int n, int way)
{
	//升序排序
	if (way == 0)
	{
		//对第i个数字进行替换
		for (int i = 0, j, least; i < n - 1; i++)
		{
			//在i后面的数字中进行搜寻,搜索更小的数字
			for (j = i + 1, least = i; j < n; j++)
			{
				if (data[j] < data[least])
					least = j;
			}

			//如果该值与最小值不相同则交换(此步骤可以减小交换/赋值次数)
			if (least != i)
			{
				//将更小的数字与该数字进行调换
				int temp = data[least];
				data[least] = data[i];
				data[i] = temp;
			}
		}
	}
	//降序排序
	else if (way == 1)
	{
		for (int i = 0, j, least; i < n - 1; i++)
		{
			for (j = i + 1, least = i; j < n; j++)
			{
				if (data[j] > data[least])
					least = j;
			}
			if (least != i)
			{
				int temp = data[least];
				data[least] = data[i];
				data[i] = temp;
			}
		}
	}
}

int main()
{
	//定义数组大小
	const int Num = 20;

	int Arr[Num] = { 92,57,42,69,89,16,24,44,52,11,73,9,45,3,64,29,87,26,78,31 };
	cout << "排序前:";
	for (int i = 0; i < Num; i++)
		cout << Arr[i] << " ";
	cout << endl;

	//升序排序
	Selectionsort(Arr, Num, 0);
	cout << "排序后:";
	for (int i = 0; i < Num; i++)
		cout << Arr[i] << " ";
	cout << endl;

	//降序排序
	Selectionsort(Arr, Num, 1);
	cout << "排序后:";
	for (int i = 0; i < Num; i++)
		cout << Arr[i] << " ";
	cout << endl;

	system("pause");
	return 0;
}


冒泡排序

  • 原理:通过比较将较小的值一次一次换到最前方

步骤:

  1. 从第一个次交换开始,总共进行n-1次交换
  2. 从最后一个数字开始向上排序
  3. 将该数字与前面一个数字进行比较,若比前面小则交换

改进策略:
bool类型做标记,若有一次没有交换,即该数字与前面一个数字相等,则跳过一个回合

#include <iostream>
using namespace std;

void Bubblesort(int data[], int n, int way)
{
	//升序排序
	if (way == 0)
	{
		//bool类型做标记,若有一次没有交换,即该数字与前面一个数字相等,则跳过一个回合
		//该行为可以减少冒泡排序的交换次数
		bool change = true;
		//从第一个次交换开始,总共进行n-1次交换
		for (int i = 0; i < n - 1&&change; i++)
		{
			//从最后一个数字开始交换,将change默认为false
			for (int j = n - 1,change= false ; j > i; --j)
			{
				//将该数字与前面一个数字进行比较,若比前面小则交换
				if (data[j] < data[j - 1])
				{
					int temp = data[j];
					data[j] = data[j - 1];
					data[j - 1] = temp;
					//发生交换,change改为true
					change = true;
				}
			}
		}
	}
	//降序排序
	else if (way == 1)
	{
		bool change = true;
		for (int i = 0; i < n - 1 && change; i++)
		{
			for (int j = n - 1, change = false; j > i; --j)
			{
				if (data[j] > data[j - 1])
				{
					int temp = data[j];
					data[j] = data[j - 1];
					data[j - 1] = temp;
					change = true;
				}
			}
		}
	}
}

int main()
{
	//定义数组大小
	const int Num = 20;

	int Arr[Num] = { 92,57,42,69,89,16,24,44,52,11,73,9,45,3,64,29,87,26,78,31 };
	cout << "排序前:";
	for (int i = 0; i < Num; i++)
		cout << Arr[i] << " ";
	cout << endl;

	//升序排序
	Bubblesort(Arr, Num, 0);
	cout << "排序后:";
	for (int i = 0; i < Num; i++)
		cout << Arr[i] << " ";
	cout << endl;

	//降序排序
	Bubblesort(Arr, Num, 1);
	cout << "排序后:";
	for (int i = 0; i < Num; i++)
		cout << Arr[i] << " ";
	cout << endl;

	system("pause");
	return 0;
}


梳排序

  • 原理:梳排序并不是一种单独的排序方式,而是在排序之前先对数据预处理,将一些大的数字放在后面,小的数字放在前面,处理完后再进行排序,本例中用的是冒泡排序。

步骤:

  1. 初始化步长
  2. 因子s=1.3用来确定元素的位置之间的间距,减少step的大小直至step/1.3<1时结束
  3. data[j]与data[j-step]比较,并进行位置调换
#include <iostream>
using namespace std;

void Combsort(int data[],const int n, int way)
{
	//升序排序
	if (way == 0)
	{
		//初始化步长
		int step = n, j, k;
		//因子s=1.3用来确定元素的位置之间的间距(Box和Lacey1991)
		//直至step/1.3<1时结束
		while ((step = int(step / 1.3)) > 1)
		{
			//data[j]与data[j-step]比较,并进行位置调换
			for (j = n - 1; j >= step; j--)
			{
				k = j - step;
				if (data[j] < data[k])
				{
					int temp = data[j];
					data[j] = data[k];
					data[k] = temp;
				}
			}
		}

		//冒泡排序
		bool change = true;
		for (int i = 0; i < n - 1 && change; i++)
		{
			for (int j = n - 1, change = false; j > i; --j)
			{
				if (data[j] < data[j - 1])
				{
					int temp = data[j];
					data[j] = data[j - 1];
					data[j - 1] = temp;
					change = true;
				}
			}
		}
	}
	//降序排序
	else if (way == 1)
	{
		int step = n, j, k;
		while ((step = int(step / 1.3)) > 1)
		{
			for (j = n - 1; j >= step; j--)
			{
				k = j - step;
				if (data[j] > data[k])
				{
					int temp = data[j];
					data[j] = data[k];
					data[k] = temp;
				}
			}
		}
		bool change = true;
		for (int i = 0; i < n - 1 && change; i++)
		{
			for (int j = n - 1, change = false; j > i; --j)
			{
				if (data[j] > data[j - 1])
				{
					int temp = data[j];
					data[j] = data[j - 1];
					data[j - 1] = temp;
					change = true;
				}
			}
		}
	}
}

int main()
{
	//定义数组大小
	const int Num = 20;

	int Arr[Num] = { 92,57,42,69,89,16,24,44,52,11,73,9,45,3,64,29,87,26,78,31 };
	cout << "排序前:";
	for (int i = 0; i < Num; i++)
		cout << Arr[i] << " ";
	cout << endl;

	//升序排序
	Combsort(Arr, Num, 0);
	cout << "排序后:";
	for (int i = 0; i < Num; i++)
		cout << Arr[i] << " ";
	cout << endl;

	//降序排序
	Combsort(Arr, Num, 1);
	cout << "排序后:";
	for (int i = 0; i < Num; i++)
		cout << Arr[i] << " ";
	cout << endl;

	system("pause");
	return 0;
}


请在转载文章过程中明确标注文章出处!尊重原创,尊重知识产权,谢谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值