交换排序:快速排序 学习
来源:互联网 发布:ui 设计软件 编辑:程序博客网 时间:2024/05/01 11:35
快速排序是对冒泡排序的一种改进。它采用了分治的策略。一般可分为3步:
(1) 分解:即寻找基准(pivot),将比pivot小的数全部放到左边,比pivot大的数放到右边。
(2) 求解:通过递归调用实现左右子区间的快速排序。
(3) 组合:就是对有序的左右子区间组合,但对快速排序而言,这个步骤可看成空操作。
表2-1 快速排序的时间复杂度
初始状态
最好
最坏
无序(平均)
第i趟的键比较次数
即每次取的pivot为中值,左右子区间大小相等。
n-i(每次划分的区间为n-i+1,选取的pivot不是最大就是最小,即划分后的子区间只比原来小1)
总的键比较次数
n(n-1)/2
时间复杂度
O(n*lb(n))
O(n^2)
O(n*lb(n))
表2-1 快速排序的空间复杂度
快速排序需要一个栈来实现递归,每层递归调用的指针和参数均用栈来存放,若每次划分较均匀,则其递归树的高度为O(lb(n))。最坏的情况下,递归树是一个单支树,则其递归树的高度为O(n)。快速排序是一种不稳定的排序。
// quicksort.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"void quick_sort(int *a,int left,int right){int l=left,r=right;//choose the first number to be sentryint k=a[l];if(l>=r) return ;while(l!=r){while(l<r&& a[r]>=k)r--;a[l]=a[r];while(l<r&& a[l]<=k)l++;a[r]=a[l];}a[l]=k;quick_sort(a,left,l-1);quick_sort(a,l+1,right);}int _tmain(int argc, _TCHAR* argv[]){int a[]={46,58,15,45,90,18,10,62};quick_sort(a,0,7);return 0;}
- 交换排序:快速排序 学习
- 交换排序--快速排序
- 交换排序:快速排序
- 交换排序-快速排序
- 交换排序-快速排序
- 交换排序------快速排序
- 【交换排序】快速排序
- 交换排序---快速排序
- 交换排序-快速排序
- 交换排序-快速排序
- 交换排序--快速排序
- 交换排序-快速排序
- 交换排序之----快速排序
- 交换排序之快速排序
- 【交换排序】快速排序--Java
- 交换排序—快速排序
- 交换类排序-快速排序
- 交换排序_2.快速排序
- 使用 Socket 通信实现 FTP 客户端程序
- shell查找某个文件夹的文件名并将其输出到某一个文件
- XCrashReport : Exception Handling and Crash Reporting - Part 1
- 手把手教你把Vim改装成一个IDE编程环境(图文)
- Python笔记4:字符串
- 交换排序:快速排序 学习
- 二进制
- 选择排序 学习
- ASP.NET GridView鼠标停留变色,行单击显示详细记录的事件处理
- REST教程四:更复杂的REST请求
- Could not load NIB in bundle: 'NSBundle </Users/wyd/Library/Application Support/iPhone Simulator/5.0
- Android 如何从系统图库中选择图片
- vim 中显示行号设置
- 关于 javascript 闭包及函数原型 作用链域 总结