在编程中我们常常会需要排序,但是排序最简单的是哪一种?我们可以用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; //函数返回
}
四、计数排序(桶思想)
排序代码如下图:
#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;
}
好啦,这节课就上到这里,谢谢大家的观看,记得点个赞哦~