快速排序
每次使一个中间元素确定最终位置。
任取一个元素作为枢轴
一次划分
//用第一个元素将待排序序列划分成左右两个部分 int Partition(int A[],int low,int high){ int pivot=A[low]; while(low<high){ while(low<high&&A[high]>=pivot) --high; A[low]=A[high]; while(low<high&&A[low]<=pivot) ++low; A[high]=A[low]; } A[low]=pivot; return low; }
//快排 void QuickSort(int A[],int low,int high){ if(low<high){ int pivotpos=Partition(A,low,high); QuickSort(A,low,pivotpos-1); QuickSort(A,pivotpos+1,high); } }
算法效率分析
时间复杂度:O(n*log2n)--O(n2)
空间复杂度 O(递归层数) 也就是O(log2n)--O(n)
它就是一个二叉树
二叉树层数对应了递归调用的层数。
n个节点二叉树,log2n+1取最大整数
最坏的情况
原本有序,糟糕。
随机选取一个元素作为枢轴元素
稳定性
不稳定!