给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。
本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:
输入第一行给出正整数N(≤105),随后一行给出N个(长整型范围内的)整数,其间以空格分隔。
在一行中输出从小到大排序后的结果,数字间以1个空格分隔,行末不得有多余空格。
11
4 981 10 -17 0 -20 29 50 8 43 -5
-20 -17 -5 0 4 8 10 29 43 50 981
在读入每个数据的时候进行插入排序,代码比较简单,AC。
#include
#include
#include
using namespace std;
const int maxn=100010;
int a[maxn];
int N;
/*插入排序,最后一个元素下标为n*/
int Insert_sort(int n,int x)
{
int i=n-1;
while(i>=0&&a[i]>x)
{
a[i+1]=a[i];
i--;
}
a[i+1]=x;
}
int main()
{
while(scanf("%d",&N)!=EOF)
{
int x;
for(int i=0;i
想到之前刚刚复习了希尔排序,印象里效率挺高,拿过来练练手,AC!
希尔排序思路:PTA 6-11 求自定类型元素序列的中位数
#include
#include
#include
using namespace std;
const int maxn=100010;
int a[maxn];
int N;
/*希尔排序*/
void gap_sort(int N)
{
int gap=N/2;
while(gap>0)
{
/*从第gap个元素开始,每个元素和同组的元素进行插入排序*/
for(int i=gap;i=0;j-=gap)
{
if(a[j]>tmp)
{
a[j+gap]=a[j];
}
else break;
}
a[j+gap]=tmp;
}
gap=gap/2;
}
}
int main()
{
while(scanf("%d",&N)!=EOF)
{
for(int i=0;i
思路:倒序对每一个非叶结点进行向下调整(down_adjust),由于是倒序,可以保证遍历到每个结点的时候,它的子结点的子结点比它的子结点还要大,若当前结点比它的子结点小,就不要继续往下比较了,其实进行的调整并不大。这样一轮下来就可以保证堆顶结点一定是当前最小的结点!
把当前最小的结点换到最后一个位置,再从堆顶的新元素开始,减小数据范围再进行一次向下调整,调整完堆顶又是当前最小元素,换到最后,循环此过程。最后倒序输出即为从小到大的顺序。
#include
#include
#include
using namespace std;
const int maxn=100100;
int a[maxn];
int N;
void swap(int& a,int& b)
{
int tmp=a;
a=b;
b=tmp;
}
/*从第i个元素开始向下调整,元素个数为N*/
void down_adjust(int i,int N)
{
while(i*2+1a[child+1]) //保证child总指向子结点中较小的的那个
{
child++;
}
if(a[i]>a[child])
{
swap(a[i],a[child]);
}
else break; //由于从后往前进行down_adjust,子结点的子结点一定比子结点还要大
i=child;
}
}
/*堆排序*/
void heap_sort(int N)
{
for(int i=N/2;i>=0;i--) //先对每个非叶结点进行一次向下调整,保证每个元素都比其左右子结点小
down_adjust(i,N);
for(int i=N;i>0;i--) //i表示元素个数
{
swap(a[0],a[i-1]); //此时a[0]一定是最小的元素
down_adjust(0,i-1); //减小调整范围
}
}
int main()
{
while(scanf("%d",&N)!=EOF)
{
for(int i=0;i=0;i--)
{
if(i!=0) printf("%d ",a[i]);
else printf("%d\n",a[i]);
}
}
return 0;
}
什么?前三种方法都AC了?姥姥是不是放水了??我的杀手锏还没用呢~~
STL大法好,一句代码就能解决的事,哈哈哈哈哈希望机试也可以用~~
不过别忘了加头文件啦 #include
#include
#include
#include
#include
using namespace std;
const int maxn=100100;
int a[maxn];
int N;
int main()
{
while(scanf("%d",&N)!=EOF)
{
for(int i=0;i