#include<bits/stdc++.h>
using namespace std;
int t[40000000];
int main(){
int n, m;
scanf("%d %d", &n, &m);
int a[n];
for(int i=0;i<n;++i){
scanf("%d", &a[i]);
t[a[i]]++;
}
for(int i=1;i<=m;++i){
if(t[i] == 0){
continue;
}else{
for(int j=0;j<t[i];++j){
printf("%d ", i);
}
}
}
return 0;
}
//以上为桶排序,n为有几个数进行排序,m为下面数的范围
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, t;
scanf("%d", &n);
int a[n];
for(int i=0;i<n;++i){
scanf("%d", &a[i]);
}
for(int i=0;i<n;++i){
for(int j=i+1;j<n;++j){
if(a[i] > a[j]){
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
for(int i=0;i<n;++i){
printf("%d ", a[i]);
}
return 0;
}
//以上为选择排序,选择排序可类比似打擂台,用第i个数去和他之后的数一一比较,若第j个数比第i个小,则进行交换
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, t;
scanf("%d", &n);
int a[n];
for(int i=0; i<n; ++i) {
scanf("%d", &a[i]);
}
for(int i=1; i<n; ++i) {
for(int j=0; j<n-i; ++j) {
if(a[j] > a[j+1]) {
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
for(int i=0; i<n; ++i) {
printf("%d ", a[i]);
}
return 0;
}
//以上为冒泡排序,将第j个数与第j往上个数相比较,最后的那个最值可以不参与第二次的比较
//因为它是一个一个比上去的所以可以不参与比较(就算比了也撼动不了)
//注意外层的i表示的是循环次数,n个数字,两两相比,应该比较n-1次
#include<bits/stdc++.h>
using namespace std;
int n;
int a[10086];
void Sort(int n, int a[]) {
if(n == 1) {
return;
}//仅有一个数字的话直接跳出函数即可,因为没什么好排的
Sort(n-1, a);//调用
int tmp=a[n];//将最后一个数字给往前面的数字中插入
int i;//一个指针
for(i=n-1; i>=1; i--) {//从后往前遍历,找寻大于它的数然后赋值
if(a[i] > tmp) {
a[i+1] = a[i];//赋值
} else {
break;//如果遇到小于的则说明他这个数到这了,该插入了
}
}
a[i+1] = tmp;//插入
}
int main() {
scanf("%d", &n);
for(int i=1; i<=n; ++i) {
scanf("%d", &a[i]);
}//输入
Sort(n, a);//调用
for(int i=1; i<=n; ++i) {
printf("%d ", a[i]);
}//输出
return 0;
}
//插入排序
//在实现的过程中大概如此
/*假定输入3 4 1进行排序
先递归直至3这个数
此时再往回走
n=2。 3 4进行操作
tmp = 4
a[n-1]即a[1] == 3
3 < 4
break;
此时i == n-1 == 1;
a[i+1] == a[n] == a[2] == tmp;
再回
n == 3
tmp = 1;
tmp < a[i](a[n-1])
a[i+1] = a[i];
此时的数组中为3 4 4
重复上述操作
得到3 3 4
i--后得到0
i+1 == 1
a[i+1] = tmp;
找到位置插入
*/
#include<bits/stdc++.h>
using namespace std;
int a[10086], b[10086], n;//全局变量
void merge(int a[], int l, int mid, int r, int t[]){//用来实现两个有序数列的合并
int i=l, j=mid+1, k=l;//定义指针i, j, k
while(i <= mid && j <= r) //让两个指针分别从各自的头开始,遍历比较每一组数
if(a[i] <= a[j]) t[k++] = a[i++];//如果i, j相比,a[i]小于a[j]则将a[i]存入至临时数组t[k]中实现后i, k后移
else t[k++] = a[j++];//如果a[j]小于a[i]则将a[j]存入至临时数组t[k]中,并将指针后移
while(i <= mid) t[k++] = a[i++];
while(j <= r) t[k++] = a[j++];
//上面这两行是在判断哪个里面的数组不为空(因为两相比较下来定有一个多余)
//继续实现赋值与指针后移
for(i=l;i<=r;i++) a[i] = t[i];//将原来临时数组中的数据存回去
}
void merge_sort(int a[], int l, int r, int t[]){
if(r == l){
return;
}//判断基础情况,如果一边里面只有一个数,那定是排好序的
int mid = l + (r - l)/2;//定义中间
merge_sort(a, l, mid, t);//从1至mid的一个数组
merge_sort(a, mid+1, r, t);//从mid+1至r(即n)的一个数组
merge(a, l, mid, r, t);//最后合并实现
}
int main(){
scanf("%d", &n);
for(int i=1;i<=n;i++){
scanf("%d", &a[i]);
}//输入
merge_sort(a, 1, n, b);//调用
for(int i=1;i<=n;i++){
printf("%d ", a[i]);
}//输出
return 0;
}
//归并思维排序
#include<bits/stdc++.h>
using namespace std;
int n, a[10086];
void quick_sort(int a[], int l, int r){
if(l == r) return ;//
int i=l;//一个指针从头开始
int j=r;//一个指针从尾开始
int mid=a[l+rand()%(r-l+1)];//随机定义一个mid数值,然后进行分两类
while(i<=j){//i还小于或等于j即i、j尚未相遇
while(a[i] < mid) i++;//如果符合判定则将i指针直接后移一位,使得那个数字包含于那个数组
while(a[j] > mid) j--;//如果符合判定则将j指针直接前移一位,使得那个数字包含于那个数组
if(i <= j){
swap(a[i], a[j]);
i++;
j--;
}//如果前两项均不符合,即有大于mid的存在在i这边,有小于mid的存在在j这边,则将它俩交换并指针移动
}
if(l < j) quick_sort(a, l, j);//对mid左边的进行排序
if(i < r) quick_sort(a, i, r);//对mid右边的进行排序
// 因为在分两类的时候左边的都是小于mid,右边的都是大于mid的所以在分别将两边排好序后,直接合并即可得到最后结果
}
int main(){
scanf("%d", &n);
for(int i=1;i<=n;++i){
scanf("%d", &a[i]);
}//输入
quick_sort(a, 1, n);//调用
for(int i=1;i<=n;++i){
printf("%d ", a[i]);
}//输出
return 0;
}
//快速排序
//第一次写,应该也不是很全(其实sort直接快排就行)
//以后学了别的会补全,也希望各位大佬指出需要改进的地方