排序思想:每次把排序区间的第一个元素作为基准。把此区间内比基准大的元素放在基准右边。比基准小的元素放在基准左边(从小到大排序)。
性能分析:(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
", low, high); //记录递归排序的区间
if(low < high)
{
int loc = Partition(low, high);
//printf("loc = %d
", 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
", a[n]);
//printf("sum = %d
", sum-1);
}
return 0;
}