PTA 7-12 排序 (25 分) 直接插入排序+希尔排序+堆排序+sort排序

给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。

本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:

  • 数据1:只有1个元素;
  • 数据2:11个不相同的整数,测试基本正确性;
  • 数据3:103个随机整数;
  • 数据4:104个随机整数;
  • 数据5:105个随机整数;
  • 数据6:105个顺序整数;
  • 数据7:105个逆序整数;
  • 数据8:105个基本有序的整数;
  • 数据9:105个随机正整数,每个数字不超过1000。

     

    输入格式:

    输入第一行给出正整数N(≤10​5​​),随后一行给出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;
}

四、sort排序

什么?前三种方法都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

 

你可能感兴趣的:(机试准备)