快速排序——C++实现
来源:互联网 发布:淘宝魔镜 编辑:程序博客网 时间:2024/05/20 05:06
快速排序采用“分治法”
首先选取一个“轴值”,假设数据中有k个数小于轴值,那么这k个数放在数组最左边的k个位置上,而不小于k的数放在数组右边的n-k个位置上。
这就实现了数组的一个“分割”。
给定分割中的值不必排序。只要求所有结点都被轴值正确分割。
快速排序再对已经分割的子序列继续进行类似分割。
下图演示了快速排序的执行过程:
源程序:
#include "stdio.h" template< class Elem >void swap( Elem list[], int i, int j ){ Elem e_tmp = list[i]; list[i] = list[j]; list[j] = e_tmp;}// 如果以第一个或者最后一个为轴值,那么正序序列或逆序序列// 的轴值的选择会使所有数分割到一边,影响排序性能// 而选取随机值开销较大,中间值是不错的选择int findpivot( int i_start, int i_end ) { return ( i_start + i_end ) / 2;}// 描述:// 分别从头尾往中间移动,与轴值比较,// 并且交换左右两边分别比轴值大和比轴值小的数// 返回值:// 右边分割序列第一的序号template< class Elem >int partition( Elem list[], int i_left, int i_right, Elem e_pivot ){ do { while ( list[++i_left] < e_pivot ); while ( i_right > 0 && list[--i_right] > e_pivot ); swap( list, i_left, i_right ); }while ( i_left < i_right ); // 纠正最后一次不必要的交换 swap( list, i_left, i_right ); // 此时i_left是右边第一个 return i_left;} template< class Elem > int quicksort( Elem list[], int i_start, int i_end ){ // 递归 结束条件 if ( i_end <= i_start ) return 0; int i_pivot = findpivot( i_start, i_end ); printf( "i_pivot: %d\n", i_pivot ); // put pivot at end swap( list, i_pivot, i_end ); // i_start要减1,便于在partition里先自减,再比较 // i_end不需要减1,因为i_end本身已经为pivot int i_pivot_new = partition( list, i_start - 1, i_end, list[i_end] ); printf( "i_pivot_new: %d\n", i_pivot_new ); // put pivot at the right pivot position swap( list, i_end, i_pivot_new ); quicksort( list, i_start, i_pivot_new - 1 ); quicksort( list, i_pivot_new + 1, i_end ); return 0; } int main() { int p_srcarr[] = { 72, 6, 57, 88, 60, 42, 83, 73, 48, 85 }; const int i_len = 10; printf( "sizeof( p_srcarr ): %d", sizeof( p_srcarr ) ); printf( "%s", "before quicksort\n" ); int i_index = 0; for( i_index = 0; i_index < i_len; i_index ++ ) { printf( "%4d", p_srcarr[i_index] ); } printf( "%s", "\n" ); quicksort( p_srcarr, 0, i_len - 1 ); printf( "%s", "after quicksort\n" ); for( i_index = 0; i_index < i_len; i_index ++ ) { printf( "%4d", p_srcarr[i_index] ); } printf( "%s", "\n" ); return 0; }快速排序平均时间代价为:Θ(nlogn)
参考:
《数据结构与算法分析》
0 0
- 快速排序——C语言实现
- 快速排序c实现
- 快速排序C实现
- 快速排序C实现
- 快速排序C实现
- 快速排序(C实现
- 快速排序(迭代)——ANSI C实现
- C#——快速排序
- C#——快速排序
- 排序——快速排序(C++)
- 快速排序—java实现
- 快速排序 C语言实现
- 快速排序C语言实现
- 快速排序算法(c#)实现
- c语言实现快速排序
- C/C++实现快速排序
- C语言实现快速排序
- 快速排序实现(C语言)
- 8款帅酷的HTML5/CSS3 3D动画、图片、菜单应用
- VS2005控制台程序修改nb0文件
- UI设计书籍
- structs入门1
- 美国人与欧洲人为什么都吃转基因食品?
- 快速排序——C++实现
- MySQL删除
- 忠告 整理下
- IT人才异军突起 有招网引领业界精英
- 开源软件发展的保障:分发协议
- 指尖上的艺术——如何运用代码发挥无限创意
- 从SPRO查看NAce的配置
- Sql Server2005新特性及性能
- 八件东西