Radix Sort Crashing

Radix Sort Crashing

本文关键字:Crashing Sort Radix      更新时间:2023-10-16

我认为我的算法做得很好,但当我运行代码时,它会崩溃。我想知道我是否可以用你的眼睛看看我在哪里犯了错误。我想创建一个基数排序来对列表进行排序。

#include <stdio.h>
#include <algorithm>
#include <list>
#include <iostream>
using namespace std;
void radixsort(list<int> s);
int find_max(list<int> t);
void splicing(list<int> s);
void radix_final(list<int> s, int maximum);
int main(int argc, char **argv)
{
    list<int>::iterator it;
    list<int> x;
    x.push_front(40);
    x.push_front(60);
    x.push_front(20);
    x.push_front(10);
    x.push_front(10);
    radixsort(x);
    for (it = x.begin(); it != x.end(); ++it)
    cout << ' ' << *it;
    cout << 'n';
    return 0;
}
void radixsort(list<int> s)
{
    int max = find_max(s);
    splicing(s);
    radix_final(s,max);
}
void radix_final(list<int> s, int maximum)
{
    list<int> list0;
    list<int> list1;
    const int MAX_ITERATOR = sizeof(maximum)*8;
    int divisor = 1;
    for(int i =0; i<MAX_ITERATOR;i++){
        if((s.front()/divisor)%2==0)
        {
            list0.push_back(s.front());
            s.pop_front();
        }
        else
        {
            list1.push_back(s.front());
            s.pop_front();
        }
        divisor = 2*divisor;
    }
    list<int>::iterator it;
    it = s.begin();
    s.splice(it,list1);
    s.splice(it,list0);
}
void splicing(list<int> s)
{
    list<int> even;
    list<int> odd;
    for(unsigned int i = 0; i<s.size();i++)
    {
        if(s.front()%2 ==0)
        {
            even.push_back(s.front());
            s.pop_front();
        }
        else
        {
            odd.push_back(s.front());
            s.pop_front();
        }
    } 
    list<int>::iterator it;
    it = s.begin();
    s.splice(it,odd);
    s.splice(it,even);
}
int find_max(list<int> t)
{
    int max = t.front();
    for(unsigned int i = 0; i<t.size();i++)
    {
        if (t.front() >= max)
        {
            max = t.front();
        }
        t.pop_front();
    }
    return max;
}
void radix_final(list<int> s, int maximum)
{
  list<int> list0;
  list<int> list1;
  const int MAX_ITERATOR = sizeof(maximum)*8;
  //^^^ Eh?
  int divisor = 1;
    for(list<int>::iterator x = s.begin(); x != s.end(); ++x){
        if((*x/divisor)%2==0)
             list0.push_back(*x);
        else
            list1.push_back(*x);
        divisor = 2*divisor;
    }
    list<int>::iterator it;
    it = s.begin();
    s.splice(it,list1);
    s.splice(it,list0);
}
void splicing(list<int> s)
{
    list<int> even;
    list<int> odd;
    for(list<int>::iterator x = s.begin(); x != s.end(); ++x){
    if( ((*x)%2)  == 0)
       even.push_back(*x);
    else
        odd.push_back(*x);

  }
   list<int>::iterator it;
    it = s.begin();
    s.splice(it,odd);
    s.splice(it,even);
}
int find_max(list<int> t)
{
int max = t.front();
for(list<int>::iterator x = t.begin(); x != t.end(); ++x)
{
    if (*x >= max)
    {
        max = *x;
        }
    }
    return max;
}

是代码的固定版本。我不知道他的算法知道会发生什么;然而,我确实找到了导致崩溃的列表中的问题。这与所有的弹出有关。另外,最大迭代器对我来说毫无意义。