您的位置:首页 > 其它

第七章快速排序之“快速插入排序”(练习7.4-5)

2012-01-05 22:03 309 查看
O(∩_∩)O~,这个名字乍听起来比较黄。其实就是先快速排序进行划分,等划分小到一定规模比如k时,进行插入排序,因为规模小到一定程度,插入排序的效率更高。我在前面还写过一个合并插入排序的算法,思想跟这个相似。

总的时间复杂度为O(nk+nlg(n/k)),这个很好证明:

先进行二分,划分到规模都为K时停止划分,此时深度为h,则T(n/2^h)=k,则h=lg(n/k),最底层规模为K的叶节点数目为2^lg(n/k)=n/k,每个k内部插入排序,最坏情况为O(k^2),则总的插入排序时间为(n/k)*(k^2)=nk。每一层的划分耗费为n,一共需划分lg(n/k)层,耗费为O(nlg(n/k))。则总的时间复杂度是两者相加共O(nk+nlg(n/k))。

代码如下:

#include <string.h>
#include <time.h>

#define BUFFER_SIZE 10

int Partition(int *a,int p,int r)
{
int i=0;
int j=0;
int tmp=0;
int x=0;

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

return i+1;
}

int RandomPartition(int *a,int p,int r)
{
int i=0;
int tmp=0;

srand((unsigned)time(NULL));
i=rand()%(r-p+1)+p;

tmp=a[i];
a[i]=a[r];
a[r]=tmp;

return Partition(a,p,r);
}

void InsertionSort(int *a,int p,int r)
{
int n=r-p+1;
int b
;
int i=0;
int j=0;

b[0]=a[p];
for(j=p+1;j<=r;j++)
{
i=j-1;
while(i>=0&&a[j]<=b[i])
{
b[i+1]=b[i];
i--;
}
b[i+1]=a[j];
}
for(j=p,i=0;j<=r;j++)
{
a[j]=b[i];
i++;
}
}

void RandomQuickSort(int *a,int p,int r,int k)
{
int q=0;
if(p>=r)
{
return;
}

if(r-p+1<k)
{
InsertionSort(a,p,r);
}
else
{
q=RandomPartition(a,p,r);
RandomQuickSort(a,p,q-1,k);
RandomQuickSort(a,q+1,r,k);
}
}

int main()
{
int i=0;
int j=0;
int a[BUFFER_SIZE];
//随机生成数组
srand((unsigned)time(NULL));
for(j=0;j<BUFFER_SIZE;j++)
{
a[j]=rand()%100;
}
printf("随机生成的数组:\n");
for(i=0;i<BUFFER_SIZE;i++)
{
printf("%d ",a[i]);
}
printf("\n");

RandomQuickSort(a,0,BUFFER_SIZE-1,1);
printf("对数组进行快速插入排序:\n");
for(i=0;i<BUFFER_SIZE;i++)
{
printf("%d ",a[i]);
}

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐