选择排序、冒泡排序、直接插入排序

选择排序

时间复杂度 O(n^2)

选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。比较拗口,举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。

冒泡排序

时间复杂度  最差O(n^2)  最好O(n)

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

直接插入排序

时间复杂度 O(n^2)

一种查找比较操作和记录移动操作交替地进行的方法。具体做法:

将待插入记录R[i]的关键字从右向左依次与有序区中记录R[j](j=i-1,i-2,…,1)的关键字进行比较:

若R[j]的关键字大于R[i]的关键字,则将R[j]后移一个位置;

若R[j]的关键字小于或等于R[i]的关键字,则查找过程结束,j+1即为R[i]的插入位置。

关键字比R[i]的关键字大的记录均已后移,所以j+1的位置已经腾空,只要将R[i]直接插入此位置即可完成一趟直接插入排序。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
	int a[15],b[15],c[15];
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
		b[i]=a[i];
		c[i]=a[i];
	}
	//选择排序
	for(int i=0;i<n;i++)
	{
		int mi=a[i];
		int k=i;
		for(int j=i+1;j<n;j++)
		{
			if(mi>a[j])
			{
				mi=a[j];
				k=j;
			}
		}
		if(mi!=a[i])
		{
			int temp=a[i];
			a[i]=a[k];
			a[k]=temp;
		}
	}
	for(int i=0;i<n;i++)
		printf(" %d",a[i]);
	printf("\n");
	//冒泡排序
	for(int i=0;i<n-1;i++)
	{
		for(int j=0;j<n-1-i;j++)
		{
			if(b[j]>b[j+1])
			{
				int temp=b[j];
				b[j]=b[j+1];
				b[j+1]=temp;
			}
		}
	}
	for(int i=0;i<n;i++)
		printf(" %d",b[i]);
	printf("\n");
	//直接插入排序
	for(int i=1;i<n;i++)
	{
		if(c[i]<c[i-1])
		{
			int temp=c[i];
			int j;
			for(j=i-1;j>=0&&c[j]>temp;j--)
				c[j+1]=c[j];
			c[j+1]=temp;
		}
	}
	for(int i=0;i<n;i++)
		printf(" %d",c[i]);
	printf("\n");
	return 0;
}
/*5
4 9 1 6 3
 1 3 4 6 9
 1 3 4 6 9
 1 3 4 6 9
请按任意键继续. . .*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值