快速排序

来源:互联网 发布:linux内核 pdf 编辑:程序博客网 时间:2024/05/02 01:11


edit version : 2017-3-5


最近在全面阅读排序算法,对之前的快速排序博文做下补充优化。

由于是借鉴csdn,cnblogs等多个博文,在此注明转载,不一一列举。


//quick sort//交换子表的记录,使枢轴记录到位,并返回枢轴所在的位置  private  static int Partition(int array[], int low, int high){        /*三数中值分割法*/      int m = low + (high - low) / 2;//数组中间元素的下标      if (array[low]>array[high])   //保证左端较小          swap(array, low, high);      if (array[m] > array[high])   //保证中间较小          swap(array, high, m);      if (array[m] > array[low])          swap(array, m, low);      //保证左端最小      //此时array[low]已经为整个序列左中右三个关键字的中间值      int pivotkey = array[low];        /*固定基准元      int pivotkey = array[low];      */        /*随机基准元     int randomIndex = rand() % (high - low) + low;//取数组中随机下标     swap(array, randomIndex, low);                //与第一个数交换     int pivotkey = array[low];     */        int i = low, j = high;      while(i<j) //从表的两端交替向中间扫描,当没有相遇      {          while (array[j] >= pivotkey&&i<j){              j--;          }          while (array[i] <= pivotkey&&i<j){              i++;          }          if (i<j)          {              swap(array, i, j);          }         }      //最终将基准数归位      swap(array, low, i);      return i;              //返回枢轴所在的位置  }  private  static void qSort(int array[], int low, int high){      int pivot;      if (low<high)      {          pivot = Partition(array, low, high);//算出枢轴值          qSort(array, low, pivot - 1);       //对低子表递归排序          qSort(array, pivot + 1, high);      //对高子表递归排序      }  }  //对array做快速排序  public  static int[] quickSort(int array[]){      qSort(array, 0, array.length-1);      return array;} 


0 0