快速排序

来源:互联网 发布:人工智能革命即将到来 编辑:程序博客网 时间:2024/05/24 15:37

快速排序的基本思路是:首先我们选择一个中间值middle(程序中我们可使用数组中间值),把比中间值小的放在其左边,比中间值大的放在其右边。由于这个排序算法较复杂,我们先给出其进行一次排序的程序框架(从各类数据结构教材中可得):
void QuickSort(int *pData, int left, int right)
{
 int i, j;
 int middle, iTemp;
 i = left;
 j = right;
 middle = pData[(left + right) / 2]; //求中间值
 do
 {
  while ((pData[i] < middle) && (i < right)) //从左扫描大于中值的数
   i++;
  while ((pData[j] > middle) && (j > left)) //从右扫描小于中值的数
   j--;
  if (i <= j) //找到了一对值
  {
   //交换
   iTemp = pData[i];
   pData[i] = pData[j];
   pData[j] = iTemp;
   i++;
   j--;
  }
 } while (i <= j) ; //如果两边扫描的下标交错,就停止(完成一次)
 //当左边部分有值(left<j),递归左半边
 if(left<j)
  QuickSort (pData,left,j);
  //当右边部分有值(right>i),递归右半边
 if(right>i)
  QuickSort (pData,i,right);
}
对于n个成员,快速排序法的比较次数大约为n*logn 次,交换次数大约为(n*logn)/6次。如果n为100,冒泡法需要进行4950 次比较,而快速排序法仅需要200 次,快速排序法的效率的确很高。快速排序法的性能与中间值的选定关系密切,如果每一次选择的中间值都是最大值(或最小值),该算法的速度就会大大下降。快速排序算法最坏情况下的时间复杂度为O(n2),而平均时间复杂度为O(n*logn)。