吊桶法数组排序

Hayrek 2009-09-17 02:29:40
小弟今天实现了个吊桶法排序,请各位大牛指正!

#include<stdlib.h>
#include<time.h>
#include<iostream>
#include<string.h>
using namespace std;

#define SIZE 10

void SortArrey( int [] );

int main()
{
int i = 0;
int origin[SIZE];

//分配内存空间
memset( origin, 0, sizeof(origin) );

//生成随机数
srand( time(NULL) ); //#include<time.h><stdlib.h>
for( i = 0; i <= SIZE-1; i++ ) {
origin[i] = rand() % 1000 + 1;
}

//显示origin[]
printf( "The origin arrey is: \n" );
for( i = 0; i <= SIZE-1; i++ ) {
printf( "%4d", origin[i] );
}
printf( "\n\n" );

//调用排序函数
SortArrey( origin );

printf( "\n\n" );
system( "pause" );
return 0;
}

void SortArrey( int origin[] )
{
int i, j = 0;
int m, n = 0;
int dest[SIZE][SIZE] = {0};
int a[SIZE] = {0};
int max, bitcount = 0, temp = 1;

//取出最大值
max = origin[0];
for( i = 1; i <= SIZE-1; i++ ) {
if( origin[i] > max ) {
max = origin[i];
}
}
//取最高的位数
while( (max / temp) != 0 ) {
bitcount++;
temp *= 10;
}

//赋值
for( i = 0; i <= SIZE-1; i++ ) {
a[i] = origin[i];
}

temp = 1;

while( bitcount != 0 ) {

//将a数组排序到dest[][]中
for( i = 0; i <= SIZE-1; i++ ) {
if( temp == 1 )
dest[a[i] % 10][i] = a[i];
else {
dest[(a[i]/temp) % 10][i] = a[i];
}
}

//将排好序的dest返回至a[]中
for( m = 0; m <= SIZE-1; m++ ) {
for( n = 0; n <= SIZE-1; n++ ) {
if( dest[m][n] != 0 ) {
a[j] = dest[m][n];
j++;
}
}
}

j=0;
temp *= 10;
bitcount--;

//清零dest[][]
for( m = 0; m <= SIZE-1; m++ ) {
for( n = 0; n <= SIZE-1; n++ ) {
dest[m][n] = 0;
}
}
}

//显示a[]
printf( "The sort arrey is: \n" );
for( i = 0; i <= SIZE-1; i++ ) {
printf( "%4d", a[i] );
}
}
...全文
233 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
bbsbbc110 2009-10-13
  • 打赏
  • 举报
回复
学习了。。
yshuise 2009-09-18
  • 打赏
  • 举报
回复
一般叫桶排序,不是吊桶排序。《算法导论》上有这些内容。
沐浴-vip 2009-09-18
  • 打赏
  • 举报
回复
没什么问题……本人水平不行!
sdd0124 2009-09-18
  • 打赏
  • 举报
回复
顶上,每天收获一点。
heirenhua 2009-09-17
  • 打赏
  • 举报
回复
哇,楼上的都好强,楼主的代码风格也很好,学习了!
aopha 2009-09-17
  • 打赏
  • 举报
回复
学习了。。
sea_spray 2009-09-17
  • 打赏
  • 举报
回复
不错,学习一下
mstlq 2009-09-17
  • 打赏
  • 举报
回复
很好,值得学习^_^

一点小建议

for (i = 0; i <= SIZE-1; i++)
dest[(a[i]/temp) % 10][i] = a[i];


if (temp == 1)这个判断其实挺耗资源的……
yangguangzhainan 2009-09-17
  • 打赏
  • 举报
回复
up
AldisZhan 2009-09-17
  • 打赏
  • 举报
回复
这就是基数排序  
“基数排序法”(radix sort)则是属于“分配式排序”(distribution sort),基数排序法又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的比较性排序法

更好的使用快速排序和他的变种算法
快排 就不说了
说说变种的快排

  平衡快排(Balanced quicksort): 每次尽可能地选择一个能够代表中值的元素作为关键数据,然后遵循普通快排的原则进行比较、替换和递归。
外部快排(External quicksort): 与普通快排不同的是,关键数据是一段buffer,首先将之前和之后的M/2个元素读入buffer并对该buffer中的这些元素进行排序,然后从被排序数组的开头(或者结尾)读入下一个元素,假如这个元素小于buffer中最小的元素,把它写到最开头的空位上;假如这个元素大于buffer中最大的元素,则写到最后的空位上;否则把buffer中最大或者最小的元素写入数组,并把这个元素放在buffer里。保持最大值低于这些关键数据,最小值高于这些关键数据,从而避免对已经有序的中间的数据进行重排。完成后,数组的中间空位必然空出,把这个buffer写入数组中间空位。然后递归地对外部更小的部分,循环地对其他部分进行排序。
三路基数快排(Three-way radix quicksort,也称作multikey quicksort、multi-key quicksort): 结合了基数排序(radix sort,如一般的字符串比较排序就是基数排序)和快排的特点,是字符串排序中比较高效的算法。该算法被排序数组的元素具有一个特点,即multikey,如一个字符串,每个字母可以看作是一个key。算法每次在被排序数组中任意选择一个元素作为关键数据,首先仅考虑这个元素的第一个key(字母),然后把其他元素通过key的比较分成小于、等于、大于关键数据的三个部分。然后递归地基于这一个key位置对“小于”和“大于”部分进行排序,基于下一个key对“等于”部分进行排序。
whg01 2009-09-17
  • 打赏
  • 举报
回复
基数排序的另一种叫法。
whg01 2009-09-17
  • 打赏
  • 举报
回复
技术排序的另一种叫法。
  • 打赏
  • 举报
回复
是基数排序吗?比较多的还是快排,归并这些
wanjingwei 2009-09-17
  • 打赏
  • 举报
回复
up
Hayrek 2009-09-17
  • 打赏
  • 举报
回复
Deitel的c how to program中的练习题,叫这名字
liao05050075 2009-09-17
  • 打赏
  • 举报
回复
吊桶法排序?之前还没听说过这个名字。。其实就是基数排序对吧?

话说,这种排序方法用得不多,因为它需要的空间很大,但它的效率却是所有排序中最好的,为O(n).
事实上,日常使用最多的还是快速排序,无论是时间还是空间上,实际表现都相当出色。

ps.计算一个数n有多少位,只要用一个式子就行了。
digitCount=(int)log10(n)+1;

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧