四种排序(选择排序、冒泡排序、快速排序和插入排序)

12 篇文章 0 订阅
9 篇文章 0 订阅


平常我们一般都用选择排序、冒泡排序、快速排序和插入排序,今天我们就来讲讲吧!

选择排序:

思路:假设最大值的下标是0,然后与后面进行比较找出未排序的最大值下标,判断是否为没比较好的最后一位,不是,就与没比较好的最后一位交换

for(i=1;i<n;i++)
{
    ma=0;//假设最大值的下标是0
    for(j=1;j<=n-i;j++)//找出未排序的最大值下标
    {
        if(a[j]>a[ma])
        {
            ma=j;
        }
    }
    if(ma!=n-i)
    {
    swap(a[n-i],a[ma]);//是否为没比较好的最后一位,不是,就与没比较好的最后一位交换
    }
}

完整代码:

//选择排序
#include<bits/stdc++.h>
using namespace std;
int main() {
	int i,j,n,ma=0,a[105];
	cin>>n;
	for(i=0; i<n; i++) {
		cin>>a[i];
	}
	for(i=1; i<n; i++) {
		ma=0;
		for(j=1; j<=n-i; j++) {
			if(a[j]>a[ma]) {
				ma=j;
			}
		}
		if(ma!=n-i) {
			swap(a[n-i],a[ma]);
		}
	}
	for(int i=0; i<n; i++) {
		cout<<a[i]<<" ";
	}
	return 0;
}

运行结果:

在这里插入图片描述

冒泡排序:

思路:每个数与后面的那个数比较,直到没排过序的最后那一个(n-i,i轮数)

for(i=1; i<=n-1; i++) {//i控制轮数
		for(j=0; j<=n-1-i; j++) {//将每一次比较以后的最大值后移一位
			if(c[j]>c[j+1]) {
				swap(c[j],c[j+1]);
			}
		}
	}

完整代码:

//冒泡排序
#include<bits/stdc++.h>
using namespace std;
int n,j,i;
int c[1110];
int main() {
	cin>>n;
	for(i=0; i<n; i++) {
		cin>>c[i];
	}
	for(i=1; i<=n-1; i++) {
		for(j=0; j<=n-1-i; j++) {
			if(c[j]>c[j+1]) {
				swap(c[j],c[j+1]);
			}
		}
	}
	for(i=0; i<n; i++) {
		cout<<c[i]<<" ";
	}
	return 0;
}

运行结果:

在这里插入图片描述

插入排序:

思路:先找出合适的位置,在将数组往后放,将找到合适的位置数据放到第一个

for(i=1; i<n; i++) 
	{
		for(j=0; j<i; j++) 
		{
			if(a[i]<=a[j]) break;//找合适的位置
		}
		if(j!=i) 
		{
			t1=a[i];
			for(k=i-1; k>=j; k--) 
			{
				a[k+1]=a[k];
			}
			a[j]=t1;//插入
		}
	}

完整代码:

//插入排序
#include<bits/stdc++.h>
using namespace std;
int main() {
	int i,j,n,l,k;
	double a[105],t1;
	cin>>n;
	for(i=0; i<n; i++) {
		cin>>a[i];
	}
	for(i=1; i<n; i++) 
	{
		for(j=0; j<i; j++) 
		{
			if(a[i]<=a[j]) break;
		}
		if(j!=i) 
		{
			t1=a[i];
			for(k=i-1; k>=j; k--) 
			{
				a[k+1]=a[k];
			}
			a[j]=t1;
		}
	}
	for(i=0;i<n;i++)
    {
        cout<<a[i]<<" ";
    }
	return 0;
}

运行结果:

在这里插入图片描述

快速排序

其实就是sort()
我们画图来讲一讲吧!
1.随意列出10个无序的数字,需要用到i,j两个变量,i在这列数的最左边,j在这列数的最右边,在这列数中将一个数设置基准值(大家可以不设第一个数为基准值),首先让j向左移动,让i向右移动。
在这里插入图片描述

2.j找到一个比基准值小的数2停下来,然后i向右移动找到比基准值大的数6停下来,然后将i,j所指向的数进行交换。
3.交换后,j继续向左移动找到比基准值小的数4停下来,然后i向右移动找到比基准值大的数7停下来,然后将i,j所指向的数进行交换。
4.接下来j继续向左移动找到比基准值小的数3,i向右移动和j碰面,此时i和j在同一个位置上停下来,此时将i和j所指向的数和基准值进行交换,即将3和5进行交换。
5.即基准值归位后,基准值左边的都是小于基准值5的数,在基准值右边的都是大于基准值5的数。
(以此类推)

完整代码

#include<bits/stdc++.h>
using namespace std;
int n,a[100],i,j;
void qp(int l,int r) {
	i=l;
	j=r;
	if(l>=r)return ;
	while(i!=j) {
		while(a[j]>=a[l]&&i<j)j--;
		while(a[i]<=a[l]&&i<j)i++;
		if(i<j)swap(a[i],a[j]);
	}
	swap(a[l],a[i]);
	qp(l,i-1);
	qp(i+1,r);
}
int main() {
	cin>>n;
	for(int i=0; i<n; i++)cin>>a[i];
	qp(0,n-1);
	for(int i=0; i<n; i++)cout<<a[i]<<' ';
	return 0;
}

运行结果

在这里插入图片描述

(完整代码适用于1010- 数组元素的排序

再见,记得三连哦!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值