您的位置:首页 > 编程语言

编程珠玑:插入排序的最优探索,以及快排

2014-07-13 18:30 253 查看
打扑克的时候选取的排序方法就是插入排序。

1.1

for(i=1;i<n;++i)

for(j=i;j>0&&arr[j-1]>arr[j];--j)

swap(arr[j-1],arr[j]);

1.2将swap内置,即t=arr[j-1];arr[j-1]=arr[j];arr[j]=t;

时间相比1.1缩短2/3

1.3 1.2中总是给t复制相同的值,将t移除内循环体

#include<stdio.h>

int main()

{

int arr[5]={1,2,3,445,12};

int i,j;

int t;

for(i=1;i<5;++i)

{

t=arr[i];

for(j=i;j>0&&arr[j-1]>t;--j)

arr[j]=arr[j-1];

arr[j]=t;

}

for(i=0;i<5;++i)

printf("%5d",arr[i]);

getch();

return 0;

}

如果插入排序排序100w个数字,花费1个小时->快速排序

2 快排

#include<stdio.h>

void ksort(int arr[],int left,int right)

{

int i=left;

int j=right;

int t=arr[left];

if(left<right)

{

while(i<j)

{

while(j>i&&arr[j]>t)

--j;

if(j>i)

arr[i++]=arr[j];

while(i<j&&arr[i]<t)

++i;

if(i<j)

arr[--j]=arr[i];

}

arr[i]=t;

ksort(arr,left,i-1);

ksort(arr,i+1,right);

}

}

int main()

{

int arr[5]={1,2,3,445,12};

int i;

ksort(arr,0,4);

for(i=0;i<5;++i)

printf("%5d",arr[i]);

getch();

return 0;

}

2.1快排的改进

选取arr中的一个随机数;

当right-left在(30,70)之间的时候,用插入排序代替快排。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐