C++实现选择排序、冒泡排序和计数排序

 在编程中我们常常会需要排序,但是排序最简单的是哪一种?我们可以用sort函数。

一、algorithm里的sort函数 

       sort函数非常简单,只需要使用一个sort(列表名+排序起点, 列表名+排序终点); 就可以了。大家可以复制下面一段代码:

#include <cstdio> // 数据小的可以用iostream
#include <algorithm> // 不能忘记算法库,否则会编译失败。
using namespace std;
int main()
{
    int n;
    scanf("%d", &n);
    int a[n+5] = {};
    for (int i = 1; i <= n; i++){
        scanf("%d", &a[i]);
    }
    sort(a + 1, a + n + 1);
    for (int i = 1; i <= n; i++){
        printf("%d", a[i]);
    }
    return 0;
}

二、选择排序 

选择排序,顾名思义,就是选择最小值/最大值去排序,演示图片如下:

函数代码如下:

void select_sort(int a[], size_t len)
{
	int index = 0;
	for (int i = 0; i < len-1; i++)
	{
		index = i;
		for (int j = i+1; j < len; j++)
		{
			//找最小元素下标
			if (a[j] < a[index])
			{
				index = j;
			}
 
		}
		//将最小元素下标和排序序列的起始位置交换
		swap(a[i], a[index]);
	}
}

在这里,为大家做一个补充,可以同时寻找最大值和最小值,这样速度更快,代码如下:

 
//优化选择排序算法,同时找最大和最小
void select_sort3(int a[], size_t len)
{
	//最小下标和最大下标
	int min_index = 0,max_index = 0;
 
	//这里的i是排序序列的起始位置,x是排序序列的末尾位置
	for (int i = 0, x = len-1; i < (len / 2); i++, x--)
	{
		min_index = i;
		max_index = i;
		for (int j = i+1; j <= x; j++)
		{
			if (a[j] < a[min_index])
			{
				min_index = j;
			}
			if (a[j] > a[max_index])
			{
				max_index = j;
			}
		}
 
		//最小值和排序序列起始位置交换
		swap(a[i], a[min_index]);
 
		//这里很重要,如果最大元素下标是i,前面已经和最小元素交换了,此时最大元素下标应该是min_index
		if (max_index == i)
		{
			max_index = min_index;
		}
		//最大值和排序序列末尾位置交换
		swap(a[x], a[max_index]);
	}
}

三、冒泡排序

冒泡排序,就像把最小值/最大值当作一个泡泡浮上水面,因此得名。

冒泡排序就是把区间最小值/最大值冒到最后。演示图片如下:

完整代码如下:

#include<iostream> //包含输入输出头文件
#include<cmath>
using namespace std; //指定名字空间
int main() 
{ //主函数
	int a[100]; //定义数组,大小100
	int N; //元素的实际个数
	int i = 0, j = 0; //循环变量,并进行初始化
	cin >> N; //输入元素个数
			  //-------输入数据-----------
	for (i = 0; i<N; i++) //输入N个元素
		cin >> a[i]; //循环体只有一行
					 //-------排序---------------
	for (i = 0; i<N - 1; i++) { //控制n-1趟冒泡
		for (j = 0; j<N - 1 - i; j++)
		{
			if (a[j]>a[j + 1]) { //比较相邻的两个元素
				int tmp; //临时变量
				tmp = a[j]; //交换
				a[j] = a[j + 1];
				a[j + 1] = tmp;
			}
		}
	}
	//--------输出----------
	for (i = 0; i<N; i++) 
	{ //使用循环,输出N个元素
		cout << a[i] << " "; //输出a[i], 后加空格,不换行
	}
	cout << endl; //所有元素输出完之后才换行
	return 0; //函数返回
}

四、计数排序(桶思想)

详细讲解请见该文章:C++实现计数排序_计数排序c++语言-CSDN博客https://blog.csdn.net/SoftpaseFar/article/details/103129395#:~:text=%E9%87%8D%E5%A4%8D%E6%AD%A5%E9%AA%A4%203%EF%BC%8C%E7%9B%B4%E5%88%B0%E6%89%80%E6%9C%89%E4%BD%8D%E6%95%B0%E9%83%BD%E6%8E%92%E5%AE%8C%E5%BA%8F%20%E4%B8%8B%E9%9D%A2%E6%98%AF%E4%BD%BF%E7%94%A8%20C%2B%2B%20%E5%AE%9E%E7%8E%B0%20%E5%9F%BA%E6%95%B0%E6%8E%92%E5%BA%8F%E7%9A%84%E4%BB%A3%E7%A0%81%EF%BC%9A%20%60%60%60cpp%20%23include,%E8%BE%93%E5%87%BA%E7%BB%93%E6%9E%9C%E4%B8%BA%EF%BC%9A2%2024%2045%2066%2075%2090%20170%20802icon-default.png?t=N7T8https://blog.csdn.net/SoftpaseFar/article/details/103129395#:~:text=%E9%87%8D%E5%A4%8D%E6%AD%A5%E9%AA%A4%203%EF%BC%8C%E7%9B%B4%E5%88%B0%E6%89%80%E6%9C%89%E4%BD%8D%E6%95%B0%E9%83%BD%E6%8E%92%E5%AE%8C%E5%BA%8F%20%E4%B8%8B%E9%9D%A2%E6%98%AF%E4%BD%BF%E7%94%A8%20C%2B%2B%20%E5%AE%9E%E7%8E%B0%20%E5%9F%BA%E6%95%B0%E6%8E%92%E5%BA%8F%E7%9A%84%E4%BB%A3%E7%A0%81%EF%BC%9A%20%60%60%60cpp%20%23include,%E8%BE%93%E5%87%BA%E7%BB%93%E6%9E%9C%E4%B8%BA%EF%BC%9A2%2024%2045%2066%2075%2090%20170%20802

排序代码如下图: 

#include <iostream>
using namespace std;
int n, x, a[1001];
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> x;
        a[x]++;
    }
    for (int i = 1; i <= 100; i++){
        for (int j = 1; j <= a[i]; j++){
            cout << i << " ";
        }
    }
    return 0;
}

排序+去重完整代码:

#include <iostream>
using namespace std;
int n, x, a[1001];
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> x;
        a[x]++;
    }
    for (int i = 1; i <= 100; i++){
        if (a[i] > 0){
            cout << i << " ";
        }
    }
    return 0;
}

好啦,这节课就上到这里,谢谢大家的观看,记得点个赞哦~

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值