排序(各种排序方法的实现与比较)
时间限制:20 Sec 内存限制:128 MB
提交: 472 解决:226
[提交][状态][讨论版]
题目描述
查找题,在指导书已经给出了部分参考答案,目的是让大家熟悉相关套路。排序这一题,才是大家课程设计的开始。
我为大家准备了一道令人非常愉快的热身题.即将一个杂乱无序的整数序列,按照从小到大的顺序排列并输出。
题目虽然简单,但如果用教材介绍的9种方法都实现,还是需要一定的基本功和工作量的,希望大家2天左右完成。
注意:不能调用系统排序函数,源码中不要出现sort,自定义的也不行,换其它名字。
输入
测试数据不止一组,每组测试数据:
1)先输入无序序列的整数个数n;(n不超过1000000)
2)然后连续输入n个整数;
若n的值输入为0值,则输入结束.
输出
与每组输入的测试数据相对应,输出其按从小到大排好序后的整数序列.
注意:每组输出占一行.
样例输入
10
9 8 7 6 5 4 3 2 1 -1
5
88 77 66 55 33
0
样例输出
-1 1 2 3 4 5 6 7 8 9
33 55 66 77 88
提示
本题测试对第10章“内部排序”的理解程度。
可采用冒泡排序、插入排序、选择排序、快速排序、希尔排序、堆排序等方法完成此题。
警告:目的是让大家熟悉内部排序的各种算法,因此禁止调用sort或qsort等函数!
/*B quicksort*/
# include<stdio.h>
long long a[1000001];
void QuickSort(long long a[],int numsize)
{
int i=0,j=numsize-1; long long val=a[0];
if(numsize>1)
{
while(i<j)
{
for(;j>i;j--)
if(a[j]<val)
{
a[i]=a[j]; break;
}
for(;i<j;i++)
if(a[i]>val)
{
a[j]=a[i]; break;
}
}
a[i]=val;
QuickSort(a,i);
QuickSort(a+i+1,numsize-1-i);
}
}
void input(long long a[],int n)
{
int i;
for(i=0;i<n;++i)
scanf("%lld",&a[i]);
}
void print(long long a[],int n)
{
int i;
for(i=0;i<n-1;++i)
printf("%lld ",a[i]);
printf("%lld\n",a[i]);
}
int main()
{
int n;
while(scanf("%d",&n)&&n!=0)
{
input(a,n);
QuickSort(a,n);
print(a,n);
}
return 0;
}
/*B堆排序*/
# include<stdio.h>
long long a[1000001];
void HeapAdjust(long long array[],int i,int nLength)
{
int nChild;
int nTemp;
for(;2*i+1<nLength;i=nChild)
{
nChild=2*i+1;
if(nChild<nLength-1&&array[nChild+1]>array[nChild])
++nChild;
if(array[i]<array[nChild])
{
nTemp=array[i];
array[i]=array[nChild];
array[nChild]=nTemp;
}
else
break;
}
}
void HeapSort(long long array[],int length)
{
int tmp,i;
for(i=length/2-1;i>=0;--i)
HeapAdjust(array,i,length);
for(i=length-1;i>0;--i)
{
tmp=array[i];
array[i]=array[0];
array[0]=tmp;
HeapAdjust(array,0,i);
}
}
void input(long long a[],int n)
{
int i;
for(i=0;i<n;++i)
scanf("%lld",&a[i]);
}
void print(long long a[],int n)
{
int i;
for(i=0;i<n-1;++i)
printf("%lld ",a[i]);
printf("%lld\n",a[i]);
}
int main()
{
int n;
while(scanf("%d",&n)&&n!=0)
{
input(a,n);
HeapSort(a,n);
print(a,n);
}
return 0;
}
/*B c++quicksort*/
#include<iostream>
using namespace std;
__int64 a[1000001];
void Qsort(__int64 a[],int low,int high)
{
if(low>=high)
{
return;
}
int first=low;
int last=high;
int key=a[first];//用字表的第一个记录作为枢轴
while(first<last)
{
while(first<last&&a[last]>=key)--last;
a[first]=a[last];//将比第一个小的移到低端
while(first<last&&a[first]<=key)++first;
a[last]=a[first];//将比第一个大的移到高端
}
a[first]=key;//枢轴记录到位
Qsort(a,low,first-1);
Qsort(a,last+1,high);
}
void input(__int64 a[],int n)
{
int i;
for(i=0;i<n;++i)
scanf("%I64d",&a[i]);
}
void print(__int64 a[],int n)
{
int i;
for(i=0;i<n-1;++i)
printf("%I64d ",a[i]);
printf("%I64d\n",a[i]);
}
int main()
{
int n;
while(scanf("%d",&n)&&n!=0)
{
input(a,n);
Qsort(a,0,n-1);
print(a,n);
}
return 0;
}
/*BBBB*/
# include<iostream>
using namespace std;
int a[1000001];
/*冒泡*/
void Bubblesort(int a[],int n)
{
int t;
for(int i=0;i<=n-1;++i)
for(int j=1;j<n-i;++j)
if(a[j]>a[j+1])
{
t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
/*直接插入*/
void insertsort(int a[],int n){
int i;
for(i=2;i<=n;++i)
{
if(a[i]<a[i-1])
{
a[0]=a[i];
a[i]=a[i-1];
for(int j=i-2;a[0]<a[j];--j)
a[j+1]=a[j];
a[j+1]=a[0];
}
}
}
/*希尔排序*/
void ShellInsert(int a[],int dk,int n)
{
int i,j;
for(i=dk+1;i<=n;++i)
if(a[i]<a[i-dk])
{
a[0]=a[i];
for(j=i-dk;j>0&&a[0]<a[j];j-=dk)
a[j+dk]=a[j];
a[j+dk]=a[0];
}
}
void ShellSort(int a[],int n){
int k;
for(k=5;k>0;k-=2)
ShellInsert(a,k,n);
}
/*堆排序*/
void HeapAdjust(int a[],int s,int m){
int rc,j;
rc=a[s];
for(j=2*s;j<=m;j*=2)
{
if(j<m&&a[j]<a[j+1])
++j;
if(rc>=a[j])
break;
a[s]=a[j];
s=j;
}
a[s]=rc;
}
void CreatHeap(int a[],int n){
int i;
for(i=n/2;i>0;--i)
HeapAdjust(a,i,n);
}
void HeapSort(int a[],int n){
int x,i;
CreatHeap(a,n);
for(i=n;i>1;--i)
{
x=a[1];
a[1]=a[i];
a[i]=x;
HeapAdjust(a,1,i-1);
}
}
int main()
{
int n;
while(cin>>n&&n!=0)
{
for(int i=1;i<=n;++i)
cin>>a[i];
ShellSort(a,n);
for(i=1;i<=n-1;++i)
cout<<a[i]<<" ";
cout<<a[i]<<endl;
}
return 0;
}
总结:时间最快的是 快排 ,冒泡和直接排序会时间超限