我试图通过创建一个程序来改进我的C ++,该程序将使用1到10 ^
6之间的大量数字。将在每次通过中存储数字的存储桶是节点数组(其中node是我创建的包含值和下一个node属性的结构)。
根据最低有效值将数字分类到存储桶后,我将一个存储桶的末尾指向另一个存储桶的开始(这样我可以快速获取存储的数字而不会破坏顺序)。我的代码没有错误(无论是编译还是运行时),但是我遇到了如何解决其余6个迭代的难题(因为我知道数字的范围)。
我遇到的问题是,最初将数字以int数组的形式提供给radixSort函数。在第一次排序迭代之后,数字现在存储在结构数组中。有什么办法可以修改我的代码,以便我只有一个for循环用于7次迭代,或者我需要一个for循环将运行一次,而在它下面的另一个循环将运行6次,然后返回完全排序的代码。清单?
#include <iostream>
#include <math.h>
using namespace std;
struct node
{
int value;
node *next;
};
//The 10 buckets to store the intermediary results of every sort
node *bucket[10];
//This serves as the array of pointers to the front of every linked list
node *ptr[10];
//This serves as the array of pointer to the end of every linked list
node *end[10];
node *linkedpointer;
node *item;
node *temp;
void append(int value, int n)
{
node *temp;
item=new node;
item->value=value;
item->next=NULL;
end[n]=item;
if(bucket[n]->next==NULL)
{
cout << "Bucket " << n << " is empty" <<endl;
bucket[n]->next=item;
ptr[n]=item;
}
else
{
cout << "Bucket " << n << " is not empty" <<endl;
temp=bucket[n];
while(temp->next!=NULL){
temp=temp->next;
}
temp->next=item;
}
}
bool isBucketEmpty(int n){
if(bucket[n]->next!=NULL)
return false;
else
return true;
}
//print the contents of all buckets in order
void printBucket(){
temp=bucket[0]->next;
int i=0;
while(i<10){
if(temp==NULL){
i++;
temp=bucket[i]->next;
}
else break;
}
linkedpointer=temp;
while(temp!=NULL){
cout << temp->value <<endl;
temp=temp->next;
}
}
void radixSort(int *list, int length){
int i,j,k,l;
int x;
for(i=0;i<10;i++){
bucket[i]=new node;
ptr[i]=new node;
ptr[i]->next=NULL;
end[i]=new node;
}
linkedpointer=new node;
//Perform radix sort
for(i=0;i<1;i++){
for(j=0;j<length;j++){
x=(int)(*(list+j)/pow(10,i))%10;
append(*(list+j),x);
printBucket(x);
}//End of insertion loop
k=0,l=1;
//Linking loop: Link end of one linked list to the front of another
for(j=0;j<9;j++){
if(isBucketEmpty(k))
k++;
if(isBucketEmpty(l) && l!=9)
l++;
if(!isBucketEmpty(k) && !isBucketEmpty(l)){
end[k]->next=ptr[l];
k++;
if(l!=9) l++;
}
}//End of linking for loop
cout << "Print results" <<endl;
printBucket();
for(j=0;j<10;j++)
bucket[i]->next=NULL;
cout << "End of iteration" <<endl;
}//End of radix sort loop
}
int main(){
int testcases,i,input;
cin >> testcases;
int list[testcases];
int *ptr=&list[0];
for(i=0;i<testcases;i++){
cin>>list[i];
}
radixSort(ptr,testcases);
return 0;
}
我认为您的解决方案过于复杂。您可以使用输入中接收到的单个数组来实现基数,并且每个步骤中的存储桶都由一个索引数组来表示,这些索引标记了输入数组中每个存储桶的起始索引。
实际上,您甚至可以递归地执行此操作:
// Sort 'size' number of integers starting at 'input' according to the 'digit'th digit
// For the parameter 'digit', 0 denotes the least significant digit and increases as significance does
void radixSort(int* input, int size, int digit)
{
if (size == 0)
return;
int[10] buckets; // assuming decimal numbers
// Sort the array in place while keeping track of bucket starting indices.
// If bucket[i] is meant to be empty (no numbers with i at the specified digit),
// then let bucket[i+1] = bucket[i]
for (int i = 0; i < 10; ++i)
{
radixSort(input + buckets[i], buckets[i+1] - buckets[i], digit+1);
}
}
当然buckets[i+1] - buckets[i]
在i
9 时会导致缓冲区溢出,但是我省去了额外的检查或可读性;我相信您知道如何处理。
这样,您只需要调用就可以对radixSort(testcases, sizeof(testcases) / sizeof(testcases[0]), 0)
数组进行排序。
本文向大家介绍C#实现较为实用的SQLhelper,包括了C#实现较为实用的SQLhelper的使用技巧和注意事项,需要的朋友参考一下 第一次写博客,想不到写什么好b( ̄▽ ̄)d ,考虑的半天决定从sqlhelper开始,sqlhelper对程序员来说就像helloworld一样,很简单却又很重要,helloworld代表着程序员萌新第一次写代码,而sqlhelper则是初次接触数据库(不知道这种
本文向大家介绍C++调用C#的DLL实现方法,包括了C++调用C#的DLL实现方法的使用技巧和注意事项,需要的朋友参考一下 SwfDotNet是C#编写的,这是个特别好的读写Swf文件的库。本文讲述了在C++项目中,怎么让C++调用C#的DLL动态链接库文件。 具体的实现步骤如下: 一、创建C# DLL,需要指定应用类型为“类库”,代码: 二、C++客户程序,是个控制台应用,代码: 三、这里有几点
本文向大家介绍用C/C++来实现 Node.js 的模块(二),包括了用C/C++来实现 Node.js 的模块(二)的使用技巧和注意事项,需要的朋友参考一下 温故而知新,可以为湿矣 首先请大家记住这个 V8 的在线手册——http://izs.me/v8-docs/main.html。 还记得上次的 building.gyp 文件吗? 就像这样,举一反三,如果多几个 *.cc 文件
本文向大家介绍用C/C++来实现 Node.js 的模块(一),包括了用C/C++来实现 Node.js 的模块(一)的使用技巧和注意事项,需要的朋友参考一下 N久之前的一个坑——用 Node.js 来重构 NBUT 的 Online Judge,包括评测端也得重构一遍。(至于什么时候完成大家就不要关心了,(/‵Д′)/~ ╧╧ 总之我们现在要做的其实简而言之就是——用C/C++来实现 No
本文向大家介绍C#使用Selenium的实现代码,包括了C#使用Selenium的实现代码的使用技巧和注意事项,需要的朋友参考一下 介绍: Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera
情境:我有一个实现了JNI的dll,我想从一个Cpp应用程序调用其中的方法。 当前状态:根据我的理解,一个实现了JNI的dll实际上与JAVA无关,例如:在test.JAVA中,我编写了 并在testdll.cp 我认为这样的程序与JVM无关,jint结构似乎已经在JNI.h中完全定义了。 因此,我想知道是否可以直接调用而不从Cpp应用程序创建VM,如果可以,请: 参数列表中的`jnienv*`和
我们需要从RSA密钥中获取模和指数。我使用以下方法创建了我的pubilc密钥。请让我知道我们如何从中提取模数和指数部分。我已经读过这篇文章了。 //现在我想从这个公钥中得到模和指数 编辑:-我也已经发送Base64字符串到服务器,但在那里,我们面临着一个相当大的问题,找到公钥ref从Base64字符串 C#代码段 现在我们需要无法解析的公钥组件。任何帮助都很好
我正在使用owin pipeline为SAML身份验证(使用sustainsys saml库)实现SP启动的登录。我在配置的acs url上接收saml响应时遇到问题。从IDP收到saml响应,用户成功登录,但是当我试图在ACS urlendpoint读取saml响应时,该方法在调试流中从未被命中。 我相信ACSendpoint是saml响应将从idp(idp-browser和browser-ac