一些排序算法的C++写法(适用vs2022)

文章介绍了冒泡排序和选择排序两种简单的排序算法在C++中的实现。冒泡排序通过两两比较并交换来排序,最坏情况是反序,时间复杂度为O(n²)。选择排序则通过找到最小元素并交换,同样具有O(n²)的时间复杂度。文中提供了详细的代码示例,并解释了各自的运行机制。
摘要由CSDN通过智能技术生成

冒泡排序
冒泡排序冒泡排序是一种简单直观的算法,重复走过要排序的数列,两两相比较,如果先大后小则交换,把大的放后面,如此一步步将大的沉到最后,因此要注意定义冒泡排序算法中内循环是i<=n-j,这样可以避免已经沉到最后的大数重复比较。

 

(为什么定义sort?是一个动词,意思是排序、整理、分类。在计算机编程中,sort通常指将一组数据按照一定的顺序排列,以方便后续的处理或查找。常见的排序算法包括冒泡排序、快速排序、归并排序等。)

本文是一个使用冒泡排序算法对输入的数字进行排序的C++代码。代码中定义了一个sort函数用于实现冒泡排序,以及一个main函数用于接收输入并输出排序后的结果。

在sort函数中,使用了两个嵌套的for循环,外层循环控制比较的轮数,内层循环用于比较相邻元素并交换位置。如果当前元素大于下一个元素,则进行交换,保证每轮循环结束后,最大的元素都被冒泡到了最后。

在main函数中,首先接收用户输入的数字个数n,并动态分配一个大小为n+1的整型数组a。然后使用for循环依次接收n个数字,并存储到数组a中。接下来调用sort函数对数组a进行排序。最后使用for循环输出排序后的数组a的元素值。

什么时候最快:正序

什么时候最慢:反序
 

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
void sort(int a[],int n)
{
	int i, j,t;
	for (j = 1; j <= n - 1; j++)
		for (i = 1; i <= n - j; i++)
			if (a[i] < a[i + 1])
			{
				t = a[i];
				a[i] = a[i + 1];
					a[i + 1] = t;
			}
}
int main()
{
	int n;
	cout << "input n=" ;
	cin >> n;
	cout << endl;
	int* a = new int[n + 1];
	int i;

	cout << "a[i]=" ;
	for (i = 1; i <= n; i++)
		cin >> a[i];
	cout << endl;
	sort(a, n);
	cout << "sorted a[i]=" ;
	for (i = 1; i <= n; i++)
		cout << a[i] ;
	cout << endl;
	delete[] a;
	return 0;
}

补注:发现几个细节问题

1.cout<<endl单独写出来是为了可以生成在同一行,否则每次运行的时候都会到endl导致最后一行一个数字不美观

 

选择排序

选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。

注意和冒泡排序的区别,两个数的循环不是同步进行的,是内外层的区别,所以有括号,其次要用k代替i参与比较循环,判断的时候是i!=k才可以交换

最快最慢:没区别都,时间复杂度都是 O(n²)

 #include<iostream>
using namespace std;
void sort(int a[], int n)
{
	int i, j, k, t;
	for (i = 1; i <= n - 1; i++){
		k = i;
		//j和i+1相关,两个不独立
	for (j = i+1; j <= n; j++)
		if (a[j] < a[k])
			k = j;
	if (i != k)
	{
		t = a[k];
		a[k] = a[i];
		a[i] = t;
	}
	}
}
int main()
{
	int n;
	cout << "input n=";
	cin >> n;
	cout << endl;
	int* a = new int[n + 1];
	int i;
	cout << "input i=";
	for (i = 1; i <= n; i++)
		cin >> a[i];
	cout << endl;
	sort(a, n); 
	cout << "sorted a[i]=";
	for (i = 1; i <= n; i++)
		cout << a[i];
	cout << endl;
	delete[] a;
		return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值