sort algorithm(1)
- background info
简单排序
- bubble_sort
1.相邻选大顺序向下推,一趟完成后当前无序的全部data均被比较过,其中max沉底
2.中途有序闭眼愣做swap傻乎乎,当一趟sort中没有一次
swap发生—>整个数据范围内有序
3.time complexity O(N2)通常对排序算法不可接受
4
.对array和chain table(especially one-way chain)均可操作—>substantially单向顺序
扫描,相邻item交换
5.具有稳定性
- insertion_sort
1.补
void InsertionSort( ElementType A[], int N ) { /* 插入排序 */ int P, i; ElementType Tmp; for ( P=1; P<N; P++ ) { Tmp = A[P]; /* 取出未排序序列中的第一个元素*/ for ( i=P; i>0 && A[i-1]>Tmp; i-- ) A[i] = A[i-1]; /*依次与已排序序列中元素比较并右移*/ A[i] = Tmp; /* 放进合适的位置 */ } }
冒泡/插入均交换相邻元素消去逆序对
- shell_sort
1.希尔算法在最坏的情况下和平均情况下执行效率相差不是很多
2.实质上是一种分组插入方法
3.本质上讲,希尔排序算法是直接插入排序算法的一种改进,减少了其复制的次数,速度要快很多。 原因是,当n值很大时数据项每一趟排序需要的个数很少,但数据项的距离很长。当n值减小时每一趟需要和动的数据增多,此时已经接近于它们排序后的最终位置。
对大规模数据实际应用效果尚可,复杂度没有严格证明!----->简单排序不一定有清晰复杂度
堆排序
-
selection_sort
1.最坏情况每次比较均swap,共(N-1)次~θ(N)
2.影响效率 : 如何查找最小元
-
堆排序
1.补
2.利用堆本身节点空间
(1).为了避免元素空间复杂度及复制采用最大堆排序
(2).将max data 与最后一个位置互换后,堆规模 - -;
(3).排序完成后得到由小至大有序序列
void Swap( ElementType *a, ElementType *b ) { ElementType t = *a; *a = *b; *b = t; } void PercDown( ElementType A[], int p, int N ) { /* 改编代码4.24的PercDown( MaxHeap H, int p ) */ /* 将N个元素的数组中以A[p]为根的子堆调整为最大堆 */ int Parent, Child; ElementType X; X = A[p]; /* 取出根结点存放的值 */ for( Parent=p; (Parent*2+1)<N; Parent=Child ) { Child = Parent * 2 + 1; if( (Child!=N-1) && (A[Child]<A[Child+1]) ) Child++; /* Child指向左右子结点的较大者 */ if( X >= A[Child] ) break; /* 找到了合适位置 */ else /* 下滤X */ A[Parent] = A[Child]; } A[Parent] = X; } void HeapSort( ElementType A[], int N ) { /* 堆排序 */ int i; for ( i=N/2-1; i>=0; i-- )/* 建立最大堆 */ PercDown( A, i, N ); for ( i=N-1; i>0; i-- ) { /* 删除最大堆顶 */ Swap( &A[0], &A[i] ); /* 见代码7.1 */ PercDown( A, 0, i ); } }