快速排序:
#include <stdio.h>
#define MAX 500000
int s[MAX];
void Q_Sort(int start,int end)
{
int i,j,t;
if( start >= end ) return ;
t = s[start];
i = start;
j = end;
while( i < j)
{
while( s[j] >= t && i < j)
{
j--;
}
s[i] = s[j];
while( s[i] <= t && i < j)
{
i++;
}
s[j] = s[i];
}
s[i] = t;
Q_Sort(start,i-1);
Q_Sort(i+1,end);
}
int main()
{
int i,n;
while(scanf("%d",&n),n)
{
for( i = 0 ; i < n ; i++)
{
scanf("%d",&s[i]);
}
Q_Sort(0,n-1);
}
return 0;
}
归并
#include <stdio.h>
#define MAX 500000
int a[MAX];
int b[MAX];
void Merge(int left,int mid,int right)
{
int i,j,k;
i = left;
j = mid+1;
k = left;
while( i <= mid && j <= right )
{
if( a[i] <= a[j] )
{
b[k++] = a[i++];
}
else
{
b[k++] = a[j++];
}
}
while( i <= mid )
{
b[k++] = a[i++];
}
while( j <= right )
{
b[k++] = a[j++];
}
}
void MergeSort(int left,int right)
{
int i,mid;
if( left < right )
{
mid = ( left + right ) / 2 ;
MergeSort(left , mid);
MergeSort(mid+1 , right);
Merge(left,mid,right);
for( i = left ; i <= right ; i++)
{
a[i] = b[i];
}
}
}
int main()
{
int i,n;
while(scanf("%d",&n),n)
{
for( i = 0 ; i < n ; i++)
{
scanf("%d",&a[i]);
}
MergeSort(0,n-1);
}
return 0;
}
堆排:
#include <stdio.h>
#define MAX 500000
int s[MAX];
void Heapify(int x,int n)
{
if( x*2+1 <= n)
{
if( s[x] == s[2*x] && s[x] == s[2*x+1] ) return ;
if( s[2*x] > s[x] && s[2*x] > s[2*x+1] )
{
s[2*x] ^= s[x] ^= s[2*x] ^= s[x] ;
Heapify(2*x,n);
}
else if( s[2*x+1] > s[x] && s[2*x+1] > s[2*x] )
{
s[2*x+1] ^= s[x] ^= s[2*x+1] ^= s[x] ;
Heapify(2*x+1,n);
}
else if( s[2*x+1] == s[2*x] && s[2*x] > s[x])
{
s[2*x] ^= s[x] ^= s[2*x] ^= s[x];
Heapify(2*x,n);
}
}
else if( x*2 == n )
{
if( s[2*x] > s[x] )
{
s[2*x] ^= s[x] ^= s[2*x] ^= s[x] ;
Heapify(2*x,n);
}
}
}
void HeapSort(int n)
{
int i,k;
for( i = n/2 ; i >= 1 ; i--)
{
Heapify(i,n);
}
for( k = n ; k > 1 ; k--)
{
s[k] ^= s[1] ^= s[k] ^= s[1];
Heapify(1,k-1);
}
}
int main()
{
int i,n;
while(scanf("%d",&n),n)
{
for( i = 1 ; i <= n ; i++)
{
scanf("%d",&s[i]);
}
HeapSort(n);
for( i = 1 ; i <= n ; i++)
{
if( i != n ) printf("%d ",s[i]);
else printf("%d\n",s[i]);
}
}
return 0;
}