您的位置:首页 > 其它

快速排序(更新随机化快速排序)

2014-05-24 10:50 134 查看
快速排序也利用了分治的思想,跟归并排序排序相比减少了交换次数

int partition(int a[],int p,int r)
{
int x = a[r];
int i = p-1;
int j;
for(j = p;j<r;j++)
{
if(a[j]<=x)
{
i++;
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
int tmp = a[i+1];
a[i+1] = a[r];
a[r] = tmp;

return i+1;
}
void quicksort(int a[],int p,int r)
{
if(p<r)
{
int q = partition(a, p, r);
quicksort(a, p, q-1);
quicksort(a, q+1, r);
}
}


为什么要引入随机化快速排序。这个问题从算法的根本出发点来说,就是为了效率的提升。在一般的快排中,重要的是选择主元对数组进行划分。如果原序列是有序的,那么最坏的情况下时间复杂度为O(n2).而随机化快速排序能将时间复杂度的期望控制在O(nlgn).与非随机化快排相比,利用随机数生成器随机产生了数作为主元。

int  partition(int a[],int p,int r)
{
srand(unsigned(time(0)));
int index = rand()%(r-p) + p;
int x =a[r];
a[r] = a[index];
a[index] = x;
int i = p - 1;
int provit = a[r];
for(int j = p;j < r;j++)
{
if(a[j]<=provit)
{
i++;
int t = a[j];
a[j] = a[i];
a[i] = t;
}
}
int t = a[r];
a[r] = a[i+1];
a[i+1] = t;

return i+1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: