交换排序:快速排序 学习

来源:互联网 发布: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 快速排序的空间复杂度

快速排序需要一个栈来实现递归,每层递归调用的指针和参数均用栈来存放,若每次划分较均匀,则其递归树的高度为Olb(n))。最坏的情况下,递归树是一个单支树,则其递归树的高度为On)。快速排序是一种不稳定的排序。

 

// 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;}