排序算法-高级篇(基数排序)

排序算法-高级篇

在前两篇文章中,我回归了最基本最easy的排序算法(冒泡排序、选择排序)它们的时间复杂度都为O(n^2)和快速排序(时间复杂度为O(nlog(n))),而选择我要回顾的是更为高效的基数排序(非比较排序,基数排序的使用范围有所限制,它只能用在正整数的排序)它的时间复杂度为O(nlog10(max)),max = Max{data[0], data[1], ...}。我程序的实现是从低位->高位进行扫描。下面举个例子。

有数据 data[6] = {13, 14, 15, 24, 35, 100},因为max = 100,所以要扫描3遍,算法的执行过程如下:

扫描第一遍

0 100

1

2

3 13

4 14 24

5 15 35

6

7

8

9

data[6] = {100, 13, 14, 24, 15, 35};


扫描第二遍

0 100

1 13 14 15

2 24

 

3 35

4

5

6

7

8

9

data[6] = {100, 13, 14, 15, 24, 35};

 

扫描第三遍

0 13 14 15 24 35

1 100

 

2

 

3

4

5

6

7

8

9

data[6] = {13, 14, 15, 24, 35, 100};


实现代码如下:

/* FileName: RadixSort.cpp Author: ACb0y Create Time: 2011年2月13日23:13:16 Last modify Time: 2011年2月13日23:35:12 */ #include <iostream> using namespace std; const int MAX = 10010000; //计数器 int cnt[10]; //临时数组 int * pdigit[10]; //存放数据数组 int data[MAX]; /* 函数名: getDigit(int d, int n); 功能: 获取d第n位上的数字 参数: d (in): int: 数值 n (in): int: 第几位 返回值: 第n位上的数字 */ int getDigit(int d, int n) { while (--n) { d /= 10; } return d % 10; } /* 函数名: RadixSort(int * data, int n); 功能: 基数排序 参数: data (in): int *: 元素序列的头指针 n (in): int: 序列中的元素个数 返回值: 空 */ void RadixSort(int * data, int n) { //max用来存元素序列中的最大值 int max = data[0]; for (int i = 1; i < n; ++i) { if (data[i] > max) { max = data[i]; } } //digit是用来保存max的位数 int digit = 0; while (max) { ++digit; max /= 10; } memset(cnt, 0, sizeof(cnt)); //动态开辟空间 for (int i = 0; i < 10; ++i) { pdigit[i] = new int[n]; } //扫描digit遍 for (int i = 1; i <= digit; ++i) { //每一轮的处理过程 for (int j = 0; j < n; ++j) { int pos = getDigit(data[j], i); pdigit[pos][cnt[pos]++] = data[j]; } int c = 0; for (int j = 0; j < 10; ++j) { if (cnt[j] != 0) { for (int k = 0; k < cnt[j]; ++k) { data[c++] = pdigit[j][k]; } } } //计数器清零 memset(cnt, 0, sizeof(cnt)); } //释放空间 for (int i = 0; i < 10; ++i) { delete [] pdigit[i]; } } /* 函数名: void print(int * data, int n); 功能: 输出序列中的所有元素 参数: data (in): int *: 元素序列的头指针 n (in): int: 元素的个数 返回值: 无 */ void print(int * data, int n) { for (int i = 0; i < n; ++i) { printf("%d ", data[i]); } printf("/n"); } int main() { time_t a, b; a = time(NULL); int n = 10000000; for (int i = 0; i < n; ++i) { data[i] = rand() % 10000000; } RadixSort(data, n); b = time(NULL); cout << "deal done" << endl; cout << "time = " << b - a << "(s)" << endl; return 0; }  

对于一千万的规模排序时间只需要3秒,可见其高效性。

运行结果如下(使用的IDE是MinGW):

排序算法-高级篇(基数排序)_第1张图片

 

你可能感兴趣的:(排序算法-高级篇(基数排序))