相信大家都知道排序吧???虽然你们可以用sort,但这样你们掌握不了排序的精髓
先从最简单的讲起来(插入排序):
#include<bits/stdc++.h>
using namespace std;
int* a = NULL;
int main()
{
ios::sync_with_stdio(false);//关闭输入输出流
int n;
cin >> n;
a = (int*)malloc(sizeof(int) * n);
for(int i = 0;i < n;i++)cin >> a[i];
for(int i = 1;i < n;i++)//因为第一个元素某人有序,所以跳过
{
int j = i;
if(j - 1 >= 0 && a[j] < a[j - 1])//第一个判断防止越界,第二个判断是否需要交换
{
swap(a[j],a[j--]);
}
}
return 0;
}
但本蒟蒻没有假输出,也行吧(用不来指针和malloc可以用数组)
选择排序不想讲了……
再讲一下冒泡、希尔和快排:
先讲冒泡,原理是把最大的放到最后,这个排序十分稳定,但速度慢到离谱(一般不优化时间复杂度永远是o(n^2)的)
#include<bits/stdc++.h>
using namespace std;
int a[1009];
int main()
{
ios::sync_with_stdio(false);
int n;
cin >> n;
for(int i = 0;i < n;i++)cin >> a[i];
for(int i = 0;i < n;i++)
{
bool flag = true;
for(int j = i + 1;j < n;j++)
{
if(a[j] < a[j - 1])
{
flag = false;
swap(a[j],a[j - 1]);
}
}
if(flag)break;
}
return 0;
}
这是一个冒泡的优化,意思为如果都交换不了,那代表整个数列都是有序的了
现在来讲一下速度较快的两种排序:希尔和快排(最好掌握快排)
希尔的原理就是分组排序,每个组内的元素都有一定的间隔距离(随着轮数)
因为我打过了,所以不想再打了,我就把链接给你们:
https://3193dd5137-share.lightly.teamcode.comhttps://3193dd5137-share.lightly.teamcode.com那重点来了,快排怎么写???
总体的意思是先找到一个中位数:7个数下标就为3,6个数也为3
然后从两边找到不符合要求的数(因为是升序排序,所以左边不符规则的数为大于等于中间数,右边就不用说了)
然后第一轮的快排完了,你就用递归继续排序其他的子序列
(没懂得话可以看其他文章)
代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[100009];
void fast_sort(int* e,int left,int right)
{
int mid = e[(left + right) / 2];
int i = left,j = right;
do{
while(e[i] < mid)i++;
while(e[j] > mid)j--;
if(i > j)break;
swap(e[i],e[j]);
i++,j--;
}while(true);
if(i < right)fast_sort(e,i,right);
if(left < j)fast_sort(e,left,j);
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 0;i < n;i++)scanf("%d",&a[i]);
fast_sort(a,0,n - 1);
return 0;
}