算法之旅,直奔排序 基数排序

56 篇文章 0 订阅
36 篇文章 1 订阅

基数排序(radix sort)

  • 真言

宿舍很冷,但是为了将来,什么苦都得忍着,忍方可成大事。

  • 主题

给一堆相同具有相同位数的数排序。这些数有一个共同的特点具有相同的位数。

  • 思路

举个例子呗,例子最好理解了。

比如有如下数据,{329,457,657,839,436,720,355}.这些数字都是三位的,也就是具有相同的位数。

我们知道,对于一位数字只能是从0~9里的一个,一共有十种可能,对于单位的数字我们可以用长度为十的哈希表(开放地址的链表)去存储数据,这样我们的数据就可以存起来了。

算法演示过程







时间复杂度(n*m),n为数据量,m为数字的位数。


  • 实验

程序结果截图

  • 代码(只供参考)

代码一年前写的,很水。。。

data.txt
329/457/657/839/436/720/355/

test.cpp
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std ;


int const size = 7;
int const bit = 3 ;

class radix_sort
{
	int * Aint ;

public:
	// function:构造函数;
	radix_sort(void);
	// function:get data from file;
	void dataReader();
	// function:sort the data;
	void sort();
	// function:show the data;
	void datashow();
	// line is the line num;
	void tableinert(int (&T)[10][size],int line,int data);
	// function: save data out to file;
	void datasave();
	// function:析构函数;
	~radix_sort(void);
};


// function:构造函数;
radix_sort::radix_sort(void)
{
	Aint = new int[size] ;

}

// function:get data from file;
void radix_sort::dataReader()
{
	ifstream fileReader ;
	fileReader.open("data.txt");

	int i= 0 ;
	char c;
	while(i<size)
	{
		fileReader>>Aint[i]>>c;
		i++;
	}

	cout<<"read over "<<endl;
	fileReader.close();
}

// function:sort the data;
void radix_sort::sort()
{
	int  table[10][size] ;
	int i,j ;
	for(i = 0 ;i<10;i++)
		for(j = 0 ; j<size;j++)
		{
			// mark null
			table[i][j] = -1;
		}



		j=1;
		int mod ;
		int k;
		int num ;
		while(j<bit+1)
		{
			//the data is saved to table;
			for( i = 0 ;i< size;i++ ) 
			{
				mod = Aint[i]%int ( pow(10.0,j) )   ;
				mod = mod /int ( pow(10.0,j-1) )   ;
				// var mode : get the bit;
				this->tableinert(table,mod,Aint[i]);
			}

			i = 0 ;
			// use time to get space;
			// table is saved to Aint;
			for( k = 0; k<10;k++) 
			{
				num = 0;
				while(table[k][num] != -1)
				{
					Aint[i++]=table[k][num] ;
					table[k][num] = -1 ;
					num++;
				}
			}
			cout<<"the first time:"<<endl;
			this->datashow();
			if(i!= size) 
			{
				cout<<"error"<<endl;		
			}

			j++;
		}

}

// function:show the data;
void radix_sort::datashow()
{
	int i =0 ;
	cout<<"data follows"<<endl;
	while(i<size)
	{
		cout<<Aint[i]<<endl;
		i++ ;
	}
	cout<<"show over"<<endl;
}


// line is the line num;
void radix_sort::tableinert(int (& T)[10][size],int line,int data)
{
	int i = 0 ;
	while(i<size)
	{
		// if now space is NULL, so put it in
		if(T[line][i] == -1 )
		{
			T[line][i] = data;
			break;
		}
		i++;
	}
}


// function: save data out to file;
void radix_sort::datasave()
{
	ofstream fileWriter;
	fileWriter.open("sorteddata.txt");
	fileWriter.clear();

	int i = 0;
	while(i<size)
	{
		fileWriter<<Aint[i]<<"/";
		i++;
	}
	cout<<"save over"<<endl;
	fileWriter.close();


}

// function:析构函数;
radix_sort::~radix_sort(void)
{
	delete [] Aint ;
}

int main()
{
	radix_sort  * RS = new radix_sort() ;
	RS->dataReader();
	RS->datashow();
	RS->sort();
	RS->datasave();

	delete RS ;
	system("pause");
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值