排序算法集合
来源:互联网 发布:自我测评软件 编辑:程序博客网 时间:2024/06/05 08:45
Shell 排序
Shell 排序实现的原理就是依据不断地缩小增量排序最终达到目的;
这里的实现方式增量序列的选择:ht = [N / 2], hk = [h(k + 1) / 2]
void Shellsort( ElementType A[ ], int N ) { int i, j, Increment; ElementType Tmp;/* 1*/ for( Increment = N / 2; Increment > 0; Increment /= 2 )/* 2*/ for( i = Increment; i < N; i++ ) {/* 3*/ Tmp = A[ i ];/* 4*/ for( j = i; j >= Increment; j -= Increment ) /* 5*/ if( Tmp < A[ j - Increment ] ) // 这个地方就是插入排序的操作/* 6*/ A[ j ] = A[ j - Increment ]; else/* 7*/ break;/* 8*/ A[ j ] = Tmp; } }
堆排序
优先队列的排序时间是O(NlogN),基于该思想的算法叫做堆排序(heapsort)。
默认的二叉堆实现表达一个优先队列(堆),例如一个小堆,deletemin之后,每操作一次这个元素放到数组的末尾,直到N个都删除之后也就建立了一个递减序列。
如果预先建立一个大堆,N次deletemax之后,结果就是一个递增序列了。
typedef int ElementType; void Swap( ElementType *Lhs, ElementType *Rhs ) { ElementType Tmp = *Lhs; *Lhs = *Rhs; *Rhs = Tmp; } #define LeftChild( i ) ( 2 * ( i ) + 1 ) void PercDown( ElementType A[ ], int i, int N ) { int Child; ElementType Tmp;/* 1*/ for( Tmp = A[ i ]; LeftChild( i ) < N; i = Child ) {/* 2*/ Child = LeftChild( i );/* 3*/ if( Child != N - 1 && A[ Child + 1 ] > A[ Child ] )/* 4*/ Child++;/* 5*/ if( Tmp < A[ Child ] )/* 6*/ A[ i ] = A[ Child ]; else/* 7*/ break; }/* 8*/ A[ i ] =Tmp; } void Heapsort( ElementType A[ ], int N ) { int i;/* 1*/ for( i = N / 2; i >= 0; i-- ) /* BuildHeap *//* 2*/ PercDown( A, i, N );/* 3*/ for( i = N - 1; i > 0; i-- ) {/* 4*/ Swap( &A[ 0 ], &A[ i ] ); /* DeleteMax *//* 5*/ PercDown( A, 0, i ); } }
0 0
- 排序算法集合
- 经典排序算法集合
- 排序算法集合
- Java排序算法集合
- 排序算法集合
- 排序算法集合
- 各类排序算法集合
- 排序算法大集合
- sort排序算法集合
- 排序算法集合 -1
- 排序算法集合 -2
- 排序算法集合 -3
- 各种排序算法集合
- 经典排序算法集合
- 排序算法集合 -1
- 排序算法集合 -2
- 排序算法集合 -3
- 排序算法集合 - 4
- 题目1072:有多少不同的面值组合?
- 遍历String 并进行相关操作
- 京东 一面记录
- 智力题2元1瓶4个瓶盖换1瓶
- (转)证券公司私募(PB)整体服务
- 排序算法集合
- Linux查看文件中间行
- 一个有getMin功能的栈
- 全国各省市直辖市软考机构联系方式(办公电话、网址、联系邮箱)
- 杂谈:垃圾短信
- Spring-Boot学习(2)-----Spring-Boot-web学习
- 制作《邓选》电子版,驱出校门二十载,鸣冤叫屈无人问
- 《疯狂JAVA讲义》之三——环境配置
- 引用math.h的时候,数学函数报错为未定义的符号