排序(各種排序方法的實現與比較)
時間限制: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;
}
總結:時間最快的是 快排 ,冒泡和直接排序會時間超限