木桶排序法!!!!

好学达人 2014-01-24 07:38:39

请各位帮忙看一下:我按照“木桶排序”的思想写了一段代码,有点乱!遇到了一下问题:

1、怎么直接将带排序数组的数组大小直接传递到排序函数中,而且可以直接利用(我的代码里面无法实现);
2、带排序的数组在结果输出后,有时候会出现某个数字被其他数字覆盖了;

目前还找不到解决办法,麻烦各位解决一下!非常感谢!!!!!


#include<iostream>
using namespace std;

void bucketSort ( int a[], int size );

int main()
{
const int arraysize = 7;
int array[ arraysize ] = { 2001, 1311, 201, 8021, 921, 4101, 119 };

bucketSort ( array, arraysize );

for ( int k = 0; k < arraysize; k++ )
cout << array[ k ] << " ";

cout << endl;
return 0;
}

void bucketSort ( int a[], int size )
{
const int row = 10;
int m;
int n = 0;
int key = 1;
int count1 = 0;
int instead = 1;
int M;
int max = 0;

int bucket[ row ][ 7 ];
int c[ 7 ] = { 0 };
int a1[ 7 ] = { 0 };

for ( int x = 0; x < size; x++ )
{
if ( a[ x ] > max )
max = a[ x ];
}

do
{
count1++;
key *= 10;
}while ( max / key != 0 );

for ( int c1 = 1; c1 <= count1; c1++ )
{
m = 0;

for ( int a = 0; a < row; a++ )
{
for ( int b = 0; b < size; b++ )
bucket[ a ][ b ] = 0;
}

for ( int i = 0; i < size; i++ )
{
a1[ i ] = a[ i ];

for ( int h = 1; h <= c1; h++ )
{
M = a1[ i ] % 10;
a1[ i ] = a1[ i ] / 10;
}

switch ( M )
{
case 0:
bucket[ M ][ c[ 0 ] ] = a[ i ];
c[ 0 ]++;
break;

case 1:
bucket[ M ][ c[ 1 ] ] = a[ i ];
c[ 1 ]++;
break;
case 2:
bucket[ M ][ c[ 2 ] ] = a[ i ];
c[ 2 ]++;
break;

case 3:
bucket[ M ][ c[ 3 ] ] = a[ i ];
c[ 3 ]++;
break;

case 4:
bucket[ M ][ c[ 4 ] ] = a[ i ];
c[ 4 ]++;
break;

case 5:
bucket[ M ][ c[ 5 ] ] = a[ i ];
c[ 5 ]++;
break;

case 6:
bucket[ M ][ c[ 6 ] ] = a[ i ];
c[ 6 ]++;
break;

case 7:
bucket[ M ][ c[ 7 ] ] = a[ i ];
c[ 7 ]++;
break;

default:
break;
}
}

for ( int r = 0; r < size; r++ )
c[ r ] = 0;

n = 0;

while ( n < row )
{
for ( int t = 0; t < size; t++ )
{
if ( bucket[ n ][ t ] != 0 )
{
a[ m ] = bucket[ n ][ t ];
m++;
}
}
n++;

if ( m == size )
break;
}
}
}
...全文
194 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
好学达人 2014-01-27
  • 打赏
  • 举报
回复
引用 1 楼 Falleyes 的回复:
木桶排序参考http://blog.csdn.net/houapple/article/details/6480100 你的数组大小不是已经在参数里面有了吗? void bucketSort ( int a[], int size ); 有时候出现数字被覆盖,自己设置断点去监视。 以后发帖,要用编辑里面的代码,而且把缩进都调整好。最后3个大括号,给谁都懒得去看到底是哪一层。
被调用函数里面的size本来是7嘛,但是我的 int bucket[ row ][ 7 ]; int c[ 7 ] = { 0 }; int a1[ 7 ] = { 0 }; 直接用的7来代替了,不能直接用size?
buyong 2014-01-27
  • 打赏
  • 举报
回复
引用 4 楼 LEISIWEIWOAINI 的回复:
[quote=引用 1 楼 Falleyes 的回复:] 木桶排序参考http://blog.csdn.net/houapple/article/details/6480100 你的数组大小不是已经在参数里面有了吗? void bucketSort ( int a[], int size ); 有时候出现数字被覆盖,自己设置断点去监视。 以后发帖,要用编辑里面的代码,而且把缩进都调整好。最后3个大括号,给谁都懒得去看到底是哪一层。
被调用函数里面的size本来是7嘛,但是我的 int bucket[ row ][ 7 ]; int c[ 7 ] = { 0 }; int a1[ 7 ] = { 0 }; 直接用的7来代替了,不能直接用size?[/quote] use std::vector in c++ use malloc in c
赵4老师 2014-01-26
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试是程序员必须掌握的技能之一。
derekrose 2014-01-26
  • 打赏
  • 举报
回复
不是要让我帮你debug吧 最讨厌debug了

void b_sort(int sarray[], int array_size) {
    const int max = array_size;
    // use bucket[x][max] to hold the current count
    int bucket[10][max+1];
    // init bucket counters
    for(var x=0;x<10;x++) bucket[x][max] = 0;
    // main loop for each digit position
    for(int digit = 1; digit <= 1000000000; digit *= 10) {
        // array to bucket
        for(int i = 0; i < max; i++) {
            // get the digit 0-9
            int dig = (sarray[i] / digit) % 10;
            // add to bucket and increment count
            bucket[dig][bucket[dig][max]++] = sarray[i];
        }
        // bucket to array
        int idx = 0;
        for(var x = 0; x < 10; x++) {
            for(var y = 0; y < bucket[x][max]; y++) {
                sarray[idx++] = bucket[x][y];
            }
            // reset the internal bucket counters
            bucket[x][max] = 0;
        }
    }
}
Falleyes 2014-01-26
  • 打赏
  • 举报
回复
木桶排序参考http://blog.csdn.net/houapple/article/details/6480100 你的数组大小不是已经在参数里面有了吗? void bucketSort ( int a[], int size ); 有时候出现数字被覆盖,自己设置断点去监视。 以后发帖,要用编辑里面的代码,而且把缩进都调整好。最后3个大括号,给谁都懒得去看到底是哪一层。

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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