基数排序,,,感想

来源:互联网 发布:淘宝美工如何接私活 编辑:程序博客网 时间:2024/06/08 20:17
基数排序正常是用链表,但是new delete 反复确实效率低下
底下这个是用的c++的列队,底层效率不高
但若用游标链表可以少了new跟delete的代价,只要复制一份待排序数内存即可
但有更高效的实现方式,就是比如30个数随机分布用概率论可以算的理论上基数10的话每桶是3,
<span style="white-space:pre"></span>超出的部分用新的桶数组去排序,6-9-12总有完结的时候,比较优
真正的桶式排序 却是超大重复数的 小区间统计,比如高考,无太多意义,就是统计而已
慢慢觉得  写框架也好,写数据结构也好,不是一个例子可以抄袭,不是学会树上的几种结构就OK,
主要数据结构学的个人觉得还是手上的实现能力,,,具体工程需要具体设计优化,当然也需要证明实现的正确性,甚至空间时间的界的明确证明,
<span style="white-space:pre"></span>
#include<iostream>#include<stdio.h>#include<stdlib.h>#include<time.h>#include<deque>#define random(x) (rand()%x)using namespace std;/*============================================= 1.有30个随机数,用随机数初始化数组; 3.需要1桶数组deque<int> bucket[10],每桶一个队列, 4.以基数10桶排,弄个求得位大小函数getPerDigit();        依次遍历4次            依照位大小,全部放桶里            每桶按顺序复制到原始数组,供读取继续 ==============================================*/void baseSort(int*ia){    int getPerDigit(int digit,int ival);    deque<int> bucket[10];    for(int dgt=1;dgt!=5;++dgt)    {//总遍历4次,即4个位数        cout<<"\n       digit: "<<dgt<<"\n          ";        for(int x=0;x!=30;x++)        {            int tmp=getPerDigit(dgt,ia[x]);            bucket[tmp].push_back(ia[x]);        }//比如个位数,全放桶里完毕        //接着遍历桶放到数组        int i=0;        for(int x=0;x!=10;)        {//            if(i==30)//虽然多余不会越界//                break;            while(!bucket[x].empty())            {//某一桶依次弄空方数组里                 ia[i]=bucket[x].front();                 cout<<ia[i++]<<",";                 bucket[x].pop_front();            }            ++x;//下一桶        }//复制到原来数组,覆盖完毕        //接着弄下一位高位++digit    }}int* initialize(){    int *ia=new int[30];    srand((int)time(0));    for(int x=0;x!=30;x++)        ia[x]=random(9999);    return ia;}int getPerDigit(int digit,int ival){//digit是3,即是百位树    int base=1;    while(--digit!=0)        base*=10;//获得100    int temp=ival/base;    return temp%10;//超出位数返回0}int main(){    int* ia=initialize();    cout<<"baseSort\n       ";baseSort(ia);    cout<<"\n\nbaseSort,it,, succeed!\n     ";    for(int x=0;x!=30;x++){        cout<<ia[x]<<" ";    }    puts("\n\n");   return system("pause");}







0 0
原创粉丝点击