三大c++排序

1.选择排序

如果要对n个数实现排序,需要用到数组。为了方便理解,假设这n个数据是n个人的身高,排序即对这n个人按高矮顺序排队,第1次,从队列中选择最矮的一个人与站在第1个位置上的人交换位置,则第1位置上的人为最矮,接下来的排序就不用去管第1人了,即n个人的队列排序问题转换为n-1个人的队列排序问题,第2次,从第2~n人中选择最矮的一个人与站在第2个位置上的人交换 置,n-1个人的队列排序问题转换为n-2个人的队列排序问题,……,第n-1个和第n个人进行比较、交换。经过n-1次选择、交换后,原队列就形成了有序的队列。这种排序方式称为选择排序。归纳上述分析,具体实现步骤如下:

        (1)读入数据存放在a数组中。
        (2)在a[1]~a[n]中选择值最小的元素,与第1位置元素交换,则把最小值元素放入a[1]中。内的
        (3)在a[2]~a[n]中选择值最小的元素,与第2位置元素交换,则把第2大值元素放入a[2]中,……
        (4)直到第n-1元素与第n个元素比较排序为止。程序实现方法:用两层循环完成算法,外层循环i控制当前序列最小他存放的数组位置,内层循环控制从1+1到n序列中选择最小的元素所在位置k。
选择排序算法对数组元素需要进行约n*n次遍历。

请认真思考后在看答案

#include<bits/stdc++.h>
using namespace std;
int n,k,a[10005],temp; //定义变量 
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	for(int i=0;i<n;i++) //i控制当前序列最小值存放的数组位置 
	{
		k=i;
		for(int j=i+1;j<n;j++)//j控制从i之后到n存列中选择最小的元素所在位置k 
		{
			if(a[k]>a[j])	k=j;
			if(k!=i)
			{
				temp=a[i];
				a[i]=a[k];
				a[k]=temp;
			}                  //交换a[i]和a[k]将当前最小值放到a[i]位置 
		}
	}
	for(int i=0;i<n;i++)
	{
		cout<<a[i]<<" ";
	}
	return 0;
}

2.冒泡排序

        冒泡排序的思想:以n个人站队为例,从第1个开始,依次比较相邻的两个人是否逆序对(高在前矮在后),若逆序就交换这两人,即第1个和第2个比,若逆序,交换两人,接着第2个和第3个比,若逆序,交换两人,接着第3个和第4个比,若逆序,交换两人,……,直到n-1和n比较,经过一轮比较后,则把最高的人排到最后,即将最高的人像冒泡一样逐步冒到相应的位置。原n个人的排序问题,转换为n-1个人的排序问题。第二轮从第1个开始,依次比较相邻的两个人是否逆序对,若逆序就交换这两人,直到n-2和n-1比较。如此,进行n-1轮后,队列为有序的队列。
        从上述分析中可以看出,每进行一轮的比较之后,n个数的排序规模就转化为了n-1个数的排序规模。
        归纳上述分析,具体实现步骤如下:
        (1)读人数据存放在a数组中。
        (2)比较相邻的前后两个数据,如果前面数据大于后面的数据,就将放的数组位置两个数据交换。
        (3)对数组的第0个数据到n-1个数据进行一次遍历后,最大的一个数据就“冒”到数组第n-1个位置。
        (4)n=n-1,如果n不为0就重复前面二步,否则排序完成。中选择最小的程序实现方法:用两层循环完成算法,外层循环i控制每轮要进行多次的比较,第一轮比较n-1次,第2轮比较n-2次,……,最后一轮比较1次。内层循环j控制每轮i次比较相邻两个元素是否逆序,若逆序就交换这有个元素。

代码

#include<bits/stdc++.h>
using namespace std;
int n,k,a[10005],temp; //定义变量 
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	for(int i=n-1;i>=1;i--) 
	{
		for(int j=0;j<i;j++)
		{
			if(a[j]>a[j+1])
			{
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}
	}
	for(int i=0;i<n;i++)
	{
		cout<<a[i]<<" ";
	}
	return 0;
}

3.插入排序

插入排序思想:回忆一下打牌时抓牌的情景,为了方便打牌,抓牌时一般一边抓牌一边按花色和大小插入恰当的位置,当抓完所有的牌时,手中的牌便是有序的。这种排序方法即插入排序。
        当读入一个元素时,在已经排序好的序列中,搜寻它正确的位置,再放入读入的元素。但不该忽略一个重要的问题:在插入这个元素前,应当
先将它后面的所有元素后移一位,以保证前面处理过的元素不被覆盖。
归纳上述分析,具体实现步骤如下:
        (1)读入数据存放在a数组中。
        (2)从第2个数开始,取出当前数作为待排序数,逐个与前面的数比
较,若小于前面数,则前面数后移,当大等于前面数时,插入当前空出的
位置。
        (3)直到第n个数插入正确位置为止。
程序实现方法:用两层循环完成算法,外层循环i控制待排序的数,
从第2个数到第n个数,内层循环j控制寻找插入的位置,j值从i-1开始向
前扫描,边扫描边将数据后移,寻找到位置,插入当前值。

代码

#include<bits/stdc++.h>
using namespace std;
int a[10005],n,temp,j;
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{  
		cin>>a[i];
		temp=a[i];j=i;
		while (j>=1&&temp<a[j-1])
		{
			a[j]=a[j-1];
			j--;
		}
		a[j]=temp;
	}
	for(int i=0;i<n;i++)
	{
		cout << a[i] << " ";
	}
	cout<<endl;
	return 0;
}

请思考后在看代码哦!!!!!!!!

因博主是学生,代码难免有点小瑕疵,如果发现问题可以私信加作者微信或在评论区指出

文章制作不易,点个赞在走吧

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值