基数排序过程无须比较关键字,而是通过“分配”和“收集”过程来实现排序。它们的时间复杂度可达到线性阶:O(n),是一种稳定排序
基数排序的实现(用数组的方式,还可以通过链表实现)
#pragma once //基数排序
#include<iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
int Get_Max(int arr[], int n)
{
int i;
int max = 0;
for(i = 0; i < n; i++)
if(arr[i] > max)
max = arr[i];
return max;
}
void Count_Sort(int arr[], int n, int exp)
{
int i, count[10] = {0};
int output[10];
for(i = 0; i < n; i++)
count[(arr[i] / exp) % 10]++;
for(i = 1; i < 10; i++)
count[i] += count[i - 1];
for(i = n - 1; i >= 0; i--)
{
output[count[(arr[i] / exp) % 10] - 1] = arr[i];
count[(arr[i] / exp) % 10]--;
}
for(i = 0; i < n; i++)
arr[i] = output[i];
}
void Radix_Sort(int arr[], int n)
{
int exp;
int m = Get_Max(arr, n);
for(exp = 1; m / exp > 0; exp *= 10)
Count_Sort(arr, n, exp);
}
基数排序的测试文件
void main() //基数排序,用数组的方式实现
{
int arr[] = {170, 45, 75, 90, 802, 24, 2, 66};
int n = sizeof(arr) / sizeof(arr[0]);
Radix_Sort(arr, n);
for(int i = 0; i < n; i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
}