首页 > 代码库 > 快速排序
快速排序
排序思想:每次把排序区间的第一个元素作为基准,把此区间内比基准大的元素放在基准右边,比基准小的元素放在基准左边(从小到大排序)。
性能分析:(1)从空间复杂度方面,快速排序是递归的,每层递归调用时的指针和参数均要用栈来存放,递归调用次数与二叉树的深度一致。因此,在理想情况下,即每一趟排序都将记录序列均匀的分隔成长度接近的两个子序列,则需要栈空间为O(logn);在最坏情况下,即每趟排序之后,基准元素位置均偏向子序列的一端,此时二叉树是一个单链,则需要的栈空间为O(n)。(2)从时间复杂度方面,快速排序在一般情况下是效率很高的排序方法。在理想情况下,时间复杂度为O(nlongn);在最坏情况下,时间复杂度为O(n^2)。
注意:快速排序是一种不稳定的排序方法,如序列(4,3,6,3)排序之后序列为(3,3,4,6)。
#include<stdio.h> int a[1000], sum; int Partition(int low, int high) { int tmp = a[low]; a[0] = a[low]; while(low < high) { while(low < high && a[high] >= tmp) --high; a[low] = a[high]; while(low < high && a[low] <= tmp) ++low; a[high] = a[low]; } a[low] = a[0]; return low; } void QuickSort(int low, int high) { sum++; //printf("Sort: %d -> %d\n", low, high); //记录递归排序的区间 if(low < high) { int loc = Partition(low, high); //printf("loc = %d\n", loc); QuickSort(low, loc-1); QuickSort(loc+1, high); } } int main() { int n, i; while(~scanf("%d",&n)) { sum = 0; //递归次数 for(i = 1; i <= n; i++) scanf("%d",&a[i]); QuickSort(1, n); for(i = 1; i < n; i++) printf("%d ", a[i]); printf("%d\n", a[n]); //printf("sum = %d\n", sum-1); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。