[C] - 希尔排序,非递归的快速排序,递归的快速排序,堆排序,归并排序,基数排序

来源:网络

  
    
#include < stdio.h >
#include
< stdlib.h >
struct node
{
int key;
}r[
20 ];

struct rnode
{
int key;
int point;
};

main()
{
void print( struct node a[ 20 ], int n);
int creat();
void shell( struct node a[ 20 ], int n);
int hoare( struct node a[ 20 ], int l, int h);
void quick1( struct node a[ 20 ], int n);
void quick2( struct node a[ 20 ], int l, int h);
void heap( struct node a[ 20 ], int i, int m);
void heapsort( struct node a[ 20 ], int n);
void merges( struct node a[ 20 ], struct node a2[ 20 ], int h1, int mid, int h2);
void mergepass( struct node a[ 20 ], struct node a2[ 20 ], int l, int n);
void mergesort( struct node a[ 20 ], int n);
int yx( int m, int i);
int radixsort( struct rnode a[ 20 ], int n);
int num,l,h,c;
struct rnode s[ 20 ];
c
= 1 ;
while (c != 0 )
{
printf(
" 主菜单 \n " );
printf(
" 1 输入关键字,以-9999表示结束。\n " );
printf(
" 2 希尔排序 \n " );
printf(
" 3 非递归的快速排序 \n " );
printf(
" 4 递归的快速排序 \n " );
printf(
" 5 堆排序 \n " );
printf(
" 6 归并排序 \n " );
printf(
" 7 基数排序 \n " );
printf(
" 输入选择 (1--7,0表示结束): " );
scanf(
" %d " , & c);
switch (c)
{
case 1 :num = creat();print(r,num); break ;
case 2 :shell(r,num);print(r,num); break ;
case 3 :quick1(r,num);print(r,num); break ;
case 4 :l = 0 ;h = num - 1 ;quick2(r,l,h);
printf(
" output quick2sort result:\n " );
print(r,num);
break ;
case 5 :heapsort(r,num); break ;
case 6 :mergesort(r,num);print(r,num); break ;
case 7 :radixsort(s,num);
}
}
}
// main end

void print( struct node a[ 20 ], int n)
{
int i;
for (i = 0 ;i < n;i ++ )
printf(
" %5d " ,a[i ].key);
printf(
" \n " );
}
// print end

int creat()
{
int i,n;
n
= 0 ;
printf(
" input keys " );
scanf(
" %d " , & i);
while (i !=- 9999 )
{
r[n].key
= i;
n
++ ;
scanf(
" %d " , & i);
}
return (n);
}
// creat end

void shell( struct node a[ 20 ], int n) // 希尔排序
{
int i,j,k;
for (i = n;i >= 1 ;i -- )
a[i].key
= a[i - 1 ].key;
k
= n / 2 ;
while (k >= 1 )
{
for (i = k + 1 ;i <= n;i ++ )
{
a[
0 ].key = a[i].key;
j
= i - k;
while ((a[j].key > a[ 0 ].key) && (j >= 0 ))
{
a[j
+ k].key = a[j].key;
j
= j - k;
}
a[j
+ k] = a[ 0 ];
}
k
= k / 2 ;
}
for (i = 0 ;i < n;i ++ )
a[i].key
= a[i + 1 ].key;
printf(
" 输出希尔排序的结果:\n " );
}
// shell end

////////////////// //快速排序 ///////////////////////////

int hoare( struct node a[ 20 ], int l, int h) // 分区处理函数
{
int i,j;
struct node x;
i
= l;
j
= h;
x.key
= a[i].key;
do
{
while ((i < j) && (a[j].key >= x.key))
j
-- ;
if (i < j)
{
a[i].key
= a[j].key;
i
++ ;
}
while ((i < j) && (a[i].key <= x.key))
i
++ ;
if (i < j)
{
a[j].key
= a[i].key;
j
-- ;
}
}
while (i < j);
a[i].key
= x.key;
return (i);
}
// hoare end

void quick1( struct node a[ 20 ], int n)
{
int i,l,h,tag,top;
int s[ 20 ][ 2 ];
l
= 0 ;h = n - 1 ;tag = 1 ;top = 0 ;
do
{
while (l < h)
{
i
= hoare(a,l,h);
top
++ ;
s[top][
0 ] = i + 1 ;
s[top][
1 ] = h;
h
= h - 1 ;
}
if (top == 0 )
tag
= 0 ;
else
{
l
= s[top][ 0 ];
h
= s[top][ 1 ];
top
-- ;
}
}
while (tag == 1 );
printf(
" 输出非递归快速排序结果:\n " );
}
// quick end

void quick2( struct node a[ 20 ], int l, int h) // 递归的快速排序
{
int i;
if (l < h)
{
i
= hoare(a,l,h);
quick2(a,l,i
- 1 );
quick2(a,i
+ 1 ,h);
}
}
// quick2 end

////////////////// //快速排序结束 ////////////////////////

////////////////// //堆排序函数 //////////////////////// //

void heap( struct node a[ 20 ], int i, int m) // 调整堆的函数
{
struct node x;
int j;
x.key
= a[i].key;
j
= 2 * i;
while (j <= m)
{
if (j < m)
if (a[j].key > a[j + 1 ].key)
j
++ ;
if (a[j].key < x.key)
{
a[i].key
= a[j].key;
i
= j;
j
= 2 * i;
}
else
j
= m + 1 ;
}
a[i].key
= x.key;
}
// heap end

void heapsort( struct node a[ 20 ], int n) // 堆排序的主体函数
{
int i,v;
struct node x;
for (i = n;i > 0 ;i -- )
a[i].key
= a[i - 1 ].key;
for (i = n / 2 ;i >= 1 ;i -- )
heap(a,i,n);
printf(
" 输出堆排序结果:\n " );
for (v = n;v >= 2 ;v -- )
{
printf(
" %5d " ,a[ 1 ].key);
x.key
= a[ 1 ].key;
a[
1 ].key = a[v].key;
a[v].key
= x.key;
heap(a,
1 ,v - 1 );
}
printf(
" %5d " ,a[ 1 ].key);
for (i = 0 ;i < n;i ++ )
a[i].key
= a[i + 1 ].key;
}
// heapsort end

/////////////// //堆排序函数结束 ////////////////// /

////////////////// 归并函数 ////////////////////////

void merges( struct node a[ 20 ], struct node a2[ 20 ], int h1, int mid, int h2)
// 归并排序的核心算法
{
int i,j,k;
i
= h1;j = mid + 1 ;k = h1 - 1 ;
while ((i <= mid) && (j <= h2))
{
k
= k + 1 ;
if (a[i].key <= a[j].key)
{
a2[k].key
= a[i].key;
i
++ ;
}
else
{
a2[k].key
= a[j].key;
j
++ ;
}
}
while (i <= mid)
{
k
++ ;
a2[k].key
= a[i].key;
i
++ ;
}
while (j <= h2)
{
k
++ ;
a2[k].key
= a[j].key;
i
++ ;
}
}
// merges end

void mergepass( struct node a[ 20 ], struct node a2[ 20 ], int l, int n)
// 一趟归并
{
int j,i,h1,mid,h2;
i
= 0 ;
while ((n - i) >= 2 * l)
{
h1
= i;
mid
= h1 + l - 1 ;
h2
= i + 2 * l - 1 ;
merges(a,a2,h1,mid,h2);
i
= i + 2 * l;
}
if ((n - i) <= l)
for (j = i;j <= n;j ++ )
a2[j].key
= a[j].key;
else
{
h1
= i;
mid
= h1 + l - 1 ;
h2
= n - 1 ;
merges(a,a2,h1,mid,h2);
}
}
// mergepass end

void mergesort( struct node a[ 20 ], int n)
{
int l;
struct node a2[ 20 ];
l
= 1 ;
while (l < n)
{
mergepass(a,a2,l,n);
l
= 2 * l;
mergepass(a2,a,l,n);
l
= 2 * l;
}
printf(
" 输出归并排序的结果:\n " );
}
// mergesort end

/////////////// 归并函数结束 ///////////////

/////////////// 基数排序 ////////////////// /

int yx( int m, int i) // 分离关键字倒数第i位有效数字的算法
{
int x;
switch (i)
{
case 1 :x = m % 10 ; break ;
case 2 :x = (m % 100 ) / 10 ; break ;
case 3 :x = (m % 1000 ) / 100 ; break ;
case 4 :x = (m % 10000 ) / 1000 ; break ;
}
return (x);
}
// yx end

int radixsort( struct rnode a[ 20 ], int n)
{
int f[ 11 ],e[ 11 ],i,j,k,l,p,d,t;
for (i = 1 ;i <= n;i ++ )
{
a[i].key
= r[i - 1 ].key;
a[i].point
= i + 1 ;
}
a[n].point
= 0 ;
p
= 1 ;
printf(
" 输出关键字有效位数 d\n " );
scanf(
" %d " , & d);
printf(
" 输出基数排序的结果:\n " );
for (i = 1 ;i <= d;i ++ )
{
for (j = 0 ;j <= 10 ;j ++ )
{
f[j]
= 0 ;
e[j]
= 0 ;
}
while (p != 0 )
{
k
= yx(a[p].key,i);
if (f[k] == 0 )
{
f[k]
= p;
e[k]
= p;
}
else
{
l
= e[k];
a[l].point
= p;
e[k]
= p;
}
p
= a[p].point;
}
j
= 0 ;
while (f[j] == 0 )
j
++ ;
p
= f[j];t = e[j];
while (j < 10 )
{
j
++ ;
while ((j < 10 ) && (f[j] == 0 ))
j
++ ;
if (f[j] != 0 )
{
a[t].point
= f[j];
t
= e[j];
}
}
a[t].point
= 0 ;
t
= p;
while (t != 0 )
{
printf(
" %5d " ,a[t].key);
t
= a[t].point;
}
printf(
" \n " );
}
return (p);
}

 

你可能感兴趣的:(快速排序)