线性时间排序之基数排序

来源:互联网 发布:阿里云服务器乱码 编辑:程序博客网 时间:2024/05/29 08:05

头文件 Number.h

#pragma once
#include <iostream>
#include <math.h>
#include <time.h>
using namespace std;
class Number{
public:
 Number(void);
 Number(int num);
 ~Number(void);
 int value;
 int operator[](int i){//return the ith digit, counter from 0
  return value/(int)(pow(10.0,i)) % 10;
 }
};

 

#include "Number.h"

Number::Number(int num){
 this->value = num;
}
Number::Number(void){
}

Number::~Number(void){
}
void countSortByDigit(Number arr[], int n, int index){
 Number* B = (Number*)malloc(n*sizeof(Number));
 int C[10];
 memset(C,0,10*sizeof(int));
 for(int i=0; i<n; i++){
  C[arr[i][index]]++;
 }
 for(int i=1;i<10;i++){
  C[i]+=C[i-1];
 }

 for(int i=n-1; i>=0; i--){
  B[C[arr[i][index]]-1] = arr[i];
  C[arr[i][index]]--;
 }
 memcpy(arr,B,n*sizeof(Number));
 free(B);
}

void printArray(Number arr[], int n){
 for(int i=0; i<n; i++){
  cout<<arr[i].value<<" ";
 }
 cout<<endl;
}
void radixSort(Number arr[], int n){// three digit number
 for(int i=0; i<3; i++){
  countSortByDigit(arr,n,i);
 } 
}

void initArray(Number arr[], int n){
 srand(time(NULL));
 for(int i=0; i<n; i++){
  Number b(rand()%1000);
  arr[i] = b;
 }
}
void main(){
 const int AD = 20;
 Number arr[AD];
 initArray(arr,AD);
 printArray(arr,AD);
 radixSort(arr,AD);
 printArray(arr,AD);
}


 

原创粉丝点击