排序

一个与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
posted @ 2011-09-15 13:37  caleb yuan  阅读(152)  评论(0编辑  收藏  举报