简介:快速排序通常是实际排序应用中最好的选择,因为它的性能非常好:其期望时间复杂度为 nlgn ;
而且隐含的常数因子非常小,另外,它还能进行原址排序,甚至在虚存环境中也能很好
地工作.
特点:
1.最坏情况的时间复杂度:n^2;(发生在)
2.期望时间复杂度: nlgn;
3.原址排序
没有什么特殊的输入会导致最坏情况的发生!
注意:lgn是以2为底
方法:分治思想
a,分解
b,解决
c,合并(因为是原址,所以不用合并了)
实现:
//分区函数,可以把数据分成两部分,分界点就是排好的点
int partition(int a[], int p, int r)
{
int x = a[r];
int i,j;
i = p - 1;
for (j = p; j < r; ++j)
{
if (a[j] < x)
{
i++;//i是所以小于x的边界坐标,包括i,而i+1到j-1则是大于等于x的元素,j是当前要归类的元素
exchange(a + i, a + j);
}
}
exchange(a+i+1, a+r);//把分类的主元放在分界点上,其左边是比其小的,右边是大于或等于其值的
return i+1;//返回分界点下标
}
void quick_sort(int a[], int p, int r)
{
int q;
if (p < r)
{
q = partition(a,p,r);
quick_sort(a, p, q-1);
quick_sort(a, q+1, r);
}
}
//因为快排与输入数据的排列有关,如果是有序的,那么其性能会很差,所以,引入随机快排算法
/************************************************************************/
/* 快速排序随机化版本 */
/************************************************************************/
//思想是:每次选择主元时都是随机选取的,而不是固定取最后一个元素
int Random(int a, int b)
{
int i;
int ram = a;
for (i = 0; i < b-a; i++)
{
ram += rand()%2;//从起点做累加就可以了,其中rand()%2返回0或1
}
return ram;
}
int randomized_partition(int a[], int p, int r)
{
int i= Random(p,r);
exchange(a+i, a+r);
return partition(a,p,r);
}
void randomized_quick_sort(int a[], int p, int r)
{
int q;
if(p < r)
{
q = randomized_partition(a,p,r);
randomized_quick_sort(a, p, q-1);
randomized_quick_sort(a, q+1, r);
}
}