C++实现经典排序算法——冒泡排序,选择排序,插入排序

本文深入讲解了三种基础排序算法:冒泡排序、选择排序和插入排序。每种算法都通过示例代码展示,并分析了其时间复杂度和空间复杂度。冒泡排序通过多次比较和交换实现排序;选择排序通过多次选择最小元素并交换实现排序;插入排序则是将未排序的数据逐个插入到合适的位置。所有算法的时间复杂度均为O(n^2),空间复杂度为O(1)。

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

#1基础排序算法——冒泡排序
冒泡排序主要是通过多次 比较和交换 来实现;通过循环依次比较,不断把最小的数字排在该次比较中的最左边。即可将数组中的数按照从大到小的顺序排好。其示例代码如下:

void BubbleSort(int *a, int len) {
	int i, j, k, temp;
	for (i = 0; i < len - 1; i++) 
	{
		for (j = len - 1; j > i; j--)
		{
			if (a[j - 1] > a[j]) {
				temp = a[j - 1];
				a[j - 1] = a[j];
				a[j] = temp;
			}
		}
		printf("第%d步的排序结果:", i);
		for (k = 0; k < len; k++)
		{
			printf("%d ", a[k]);
		}
		printf("\n");
	}
}

通过进行十个随机数字的冒泡排序,每次排序结果如下:
在这里插入图片描述每次比较中最小的数字移向最左边,就像水中气泡冒出一样,因此该方法非常形象地叫做冒泡排序。不难发现,其时间复杂度为O(n2),空间复杂度为O(1)。

#2基础排序算法——选择排序
选择排序主要是通过多次选择和交换来实现:通过循环依次选出当前数字中最小的数并与其最左侧数字交换位置并将该数字从下次比较中剔除,最终获得数组中数字从小到大排列的顺序。其示例代码如下:

void SelectionSort(int *a,int len)
{
	int i, j, k, h;
	int temp;

	for (i = 0; i < len - 1; i++) {
		k = i;
		for (j = i + 1; j < len; j++) {
			if (a[j] < a[k])
				k = j;
		}
		if (k != i) {
			temp = a[i];
			a[i] = a[k];
			a[k] = temp;
		}
		cout << "第" << i+1 << "步排序结果:";
			for (h = 0; h < len - 1; h++) {
				cout << a[h] << " ";
			}
		cout << endl;
	}
}

通过进行十个随机数字的冒泡排序,每次排序结果如下:
在这里插入图片描述
不难发现,其时间复杂度为O(n2),空间复杂度为O(1)。选择排序与冒泡排序最大的差别就是交换的次数,前者是多比较少交换,后者是多比较交换。

#基础排序算法——插入排序
插入排序是对未排序的数据逐个交换到合适的插入位置而实现排序的目的。其示例代码如下:

void InsertionSort(int *a, int len) 
{
	int i, j, h, k;
	
	for (i = 1; i < len; i++)
	{
		h = a[i];
		j = i - 1;
		while (j >= 0 && h < a[j]) {
			a[j+1] = a[j];
			j--;
		}
		a[j + 1] = h;
		cout << "第" << i << "步的结果为";
		for (k = 0; k < len; k++) 
		{
			cout << a[k] << " ";

		}
		cout << endl;
	}
}

通过进行十个随机数字的冒泡排序,每次排序结果如下:
在这里插入图片描述
其时间复杂度为O(n2),空间复杂度为O(1)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值