基数排序 C++ 赋值

Posted

技术标签:

【中文标题】基数排序 C++ 赋值【英文标题】:Radix Sort C++ Assignment 【发布时间】:2012-03-13 01:43:57 【问题描述】:

我的家庭作业有问题,我不知道我哪里做错了。我必须设计一个带有 a 桶和 k 轮的基数排序函数。我需要保留桶中列表项的顺序,因此我需要为每个桶保留两个点 - 前后。 但是,当我编译代码并使用需要排序的 10 个数字运行测试代码时,我的输出仅包含 3 个数字。如果它有 20 个数字,它只打印 2。你能帮帮我吗?这是我的代码,感谢您抽出宝贵时间。编辑:至少 SigDig 我的意思是有效数字我必须改变它,因为它的名字不好

#include <cstdlib> // Provides size_t and NULL
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
using namespace std;

struct listnode  struct listnode * next;
                  unsigned long     value;  ;

struct listnode *radixsort (struct listnode *data, int a, int k)
    struct listnode *front [a], *rear [a], *cursor;
    int i=0 , j = 0, leastSigDig,base10num;
    if (data == NULL) return data;

    for (i;i<k;i++)
        base10num= pow(a,i);
        cursor = data;
        for (j=0; j<a; j++)
            front [j] = NULL;
            rear [j] = NULL;
        
        while (cursor != NULL)
            leastSigDig = ((cursor->value)/base10num)%a;
            if (rear [leastSigDig]!= NULL)
                rear[leastSigDig]->next= cursor;
                rear [leastSigDig]= cursor;
            
            else if (cursor == NULL) 
                rear [leastSigDig] = cursor;
            
            cursor = cursor->next;
        

        //Linking
            cursor = NULL;
for (int y=0; y< a-1; y++)
    int z= y+1;
    if (front [y] == NULL)
        continue;
    else if (cursor == NULL)
            cursor = front [y];
            rear [y]->next = front [z];
        
    else if (cursor != NULL) 
            rear [y]->next = front [z];


    data = cursor;
    
        
    
    return data;
   


int main(void)
  
    long i, length=10;
    long a = 10; // working with base 10
    long k = log10(length*a);
    struct listnode *node, *space;
    space =  (struct listnode *) malloc(length*sizeof(struct listnode));
    for( i=0; i< length; i++ ) 
        (space + i)->value = 2*((17*i)%length);
        (space + i)->next = space + (i+1);
    
    (space+(length-1))->next = NULL;
    node = space;
    struct listnode * temp =node;
    cout<<endl<<"List before radixsort\n" <<endl ;
    while(temp!=NULL)
    
        cout << temp->value << "\t";
        temp = temp->next;
    

    node = radixsort(node,a,k);

    listnode *check = node;
    cout << "\n\nList after radixsort \n\n";
    while (check)
    
        cout << check->value << "\t";
        check = check->next;
    
    cout << "\n\n";
    exit(0);

【问题讨论】:

我已恢复您删除的所有代码。请不要从您的问题中删除代码 - 您永远不会得到这样的答案! 【参考方案1】:

这里至少有一个问题:

//Linking
int y= 0;

for (int y; y< a-1; y++)

for 循环中的变量y 遮蔽外部作用域中的y。这意味着循环内的y 未初始化,您将陷入困境。

您应该调高编译器警告级别并注意它所说的内容。

【讨论】:

我重写了链接部分,但仍然存在问题 在桶排序时也将 else if rear[sigDig] == NULL 更改为 cursor ==NULL

以上是关于基数排序 C++ 赋值的主要内容,如果未能解决你的问题,请参考以下文章

C++ 基数排序算法

C++ 并行就地基数排序

C++:使用 LSD 基数排序对字符串进行排序崩溃

LSD基数排序c++代码

基数排序:C++实现

4.10 基数排序