基数排序

元气小坏坏 提交于 2020-01-19 03:39:59

基数排序

基数排序的本质实则是桶排序,对每一位基位数进行一次排序


例如:
在这里插入图片描述

基数排序中,我们将借助链表来当作桶

其中需要说明的内容,在代码中写好注释:

#include <iostream>
#include <list>			// 使用C++ 封装好的模板类
#include <algorithm>		// 算法库

using namespace std;

int MaxNum(int* arr, int n)
{
    initializer_list<int> i_list(arr, arr + n - 1);		// 将数组元素放入到一个列表中
    int Max = max(i_list);			// 调用 算法库中的 max 求出最大值	

    int count = 0;
    while(Max > 0)		// 求出最大值是几位数		用于对数进行几次桶排序
    {
        count++;
        Max /= 10;
    }
    
    return count;    
}
	
void RadixSort(int* arr, int n)		// 基数排序
{
    int idigit = MaxNum(arr, n);

    list<int> myList[10];		// 10 个链表     10个桶
    for(int i = 0, k = 1; i < idigit; k *= 10, i++)		// k 用来控制取第几位数
    {
        //  将数组中的元素放入桶中
	for(int j = 0; j < n; j++)
	{
	    myList[(arr[j] / k) % 10].push_back(arr[j]);		// 根据值放入对应的桶中
	}
	//  将桶中的元素放回数组中
	for(int j = 0, m = 0; j < n; j++)
	{
	    while(!myList[j].empty())
	    {
	        arr[m++] = myList[j].front();	// 取每个桶的第一个元素  按顺序来很重要
	        myList[j].pop_front();	//  取出第一个桶后,删除第一个元素
	    }
	}    
    }
        
}

int main()
{
    int arr[]{102, 504, 523, 645, 872, 622, 123, 754, 888, 131};
    
    int nSize = sizeof(arr) / sizeof(arr[0]);

    RadixSort(arr, nSize);
    for(auto i : arr)
    {
        cout << i << " ";
    }
    cout << endl;

    return 0;
}

运行结果为:

102 123 131 504 523 622 645 754 872 888

基数排序浪费了点内存,但在速度上绝对提高了不少

^ _ ^

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!