一个与C++库函数不相上下的QuickSort
(言过其实了,C++ STL的Sort实现用的是Introsort,是快速排序的变种,主要是递归过深的时候自动转换为堆排或插入排序(是堆排还是插入排序还要视具体实现而定),可以保证最坏情况下还是O(nlogn),并且充分使用了尾递归优化(快排最后不是两个递归吗?最后一个递归可以不必真的递归,可以像gcd算法一样通过迭代参数来改善运行速度),STL快排可以经受任何实践的考验,而这段代码在最坏情况下还是O(n^2)) -- by 某奋战的OIer
此代码经过了一个多月的极致优化,测试。近乎完美。
本人觉得直接将template T直接换成int,long之类爽快些!
<template T>
void sort(T a[],T st,T ed)
{ if(st<ed) //先设一个开关优化,会更快一些
{ T tmp=a[st],i=st,j=ed;
while(i<j)
{ while(a[j]>tmp&&i<j) --j; //C++在判断时,会打开编译开关,把a[j]与tmp放在前比较,这样会更快一些~~
if(i<j) a[i++]=a[j]; //ps:j-- ,i++(下行)比不了--j,++i快
while(a[i]<tmp&&i<j) ++i;//注意:这里用的不是">="或"<="而是">""<,事实证明,前者会增加交换的次数,做无用功~~~
if(i<j) a[j--]=a[i];
} //while
a[i]=tmp;
sort(a,st,i-1);
sort(a,i+1,ed);
} //if
//这里不用return语句,会快一些
}
//由于以上的种种,程序在大的排序中(N>=10e6)优势越来越大--By LinuxKernel