11.1插入排序
isort1()
一般的插入排序
m=x[0];
for(i=1; i<MAX; i++)
{
for(j=i; j<0 && x[j]<x[j-1]; j--)
{
t=x[j],x[j]=x[i],x[i]=t;
}
}
isort2()
使用内联函数swap(),代替t=x[j],x[j]=x[i],x[i]=t; 实现加速。
isort3()
将内层循环的赋值操作移到外层
for(i=1; i<MAX; i++)
{
m = x[i];
for(j=i; j>0 && m<x[j-1]; j--)
{
x[j] = x[j-1];
}
x[j] = m;
}
我测试的排序时间:
0.317s
11.2简单的快速排序
qsort1()
void myQsort(int *array, int l, int u)
{
int i;
int m;
int t;
if(l>=u)
{
return;
}
t = l;
m = l;
for(i=l+1; i<=u; i++)
{
if(array[i]<array[t])
{
m++;
swap(&array[m],&array[i]);
}
}
swap(&array[m],&array[t]);
myQsort(array,l,m-1);
myQsort(array,m+1,u);
}
我测试的排序时间:
0.012s
11.3更好的快速排序
双向划分法
问题:数组所有值相同情况下,运行时间为O(n平方)
isort3() 0.001s
qsort1() 0.635s
qsort2()
void myQsort2(int *array, int l, int u)
{
if(l>=u)
return;
int t;
int i,j;
t = l;
i = l+1;
j = u;
while(i<=j)
{
while(array[i]<array[t]) i++;
while(array[j]>array[t]) j--;
swap(&array[i],&array[j]);
i++;
j--;
}
swap(&array[t],&array[j]);
myQsort2(array,l,j-1);
myQsort2(array,j+1,u);
}
qsort2()测试时间:0.003s
随机选择划分元素
可以使用中值法,也可以使用取随机数组元素法。
swap(l,randint(l, u));
cutoff法
即当需排序的子数组长度小于一个较小的值cutoff时,
可以对其使用插入排序,插入排序对长度小的排序更高效。
展开循环体内的swap()函数
略
最终代码:
排序时间测试(带生成随机数的时间)
数组长度19999
0.314s
0.013s
0.004s
0.001s
0.642s
0.003s