写了个排序算法,思路是归并排序+冒泡排序(n=2即交换排序),时间复杂度稳定为O(n*log2(n)),几乎是稳定排序算法中最快的,特别是在大数据量的情况下更明显(对比冒泡排序O(n*(n-1)))。缺点,需要一个buf,用空间换时间……
使用时注意适当修改buf的大小,一定要大于等于(>=)排序的数组长度。如果处理的是char类型数组记得该类型。 在Launchpad + G2553@1MHz下排序一个64长度随机数组,每秒50次左右,对比冒泡排序大约在每秒15次左右。
volatile unsigned int buf[64]; volatile unsigned int i, j, t; void sort(volatile unsigned int *data, unsigned int from, unsigned int to){ unsigned int mid; if(to - from > 2){ // merge sort mid = (to + from) >> 1; sort(data, from, mid); sort(data, mid, to); i = from; j = mid; t = 0; while((i < mid) && (j < to)){ if( *(data+i) < *(data+j) ){ buf[t++] = *(data+(i ++)); }else{ buf[t++] = *(data+(j ++)); } } while(i < mid){ buf[t++] = *(data+(i ++)); } while(j < to){ buf[t++] = *(data+(j ++)); } for(t = from; t < to; t ++){ *(data+t) = buf[t-from]; } }else if(to - from == 2){ // bubble sort if(*(data + from) > *(data + to - 1)){ t = *(data + from); *(data + from) = *(data + to - 1); *(data + to - 1) = t; } } }
复制代码
之所以i,j,t,buf作为全局变量,是因为他们不需要堆栈保护,但是局部变量mid移出来就挂了…… 好吧,在做红外接收发射(电视空调都学习到一个设备上),空调的编码真长啊,必须要做压缩处理,霍夫曼树压缩要先排序
[ 本帖最后由 elulis 于 2012-7-16 02:00 编辑 ]
|