快速排序的实现

快速排序的核心思路是:
1 找一个基本的数,做到每次排序时,基数左边的数都比基本数小,基数右边的数都比基本数大。依次再对左右序列重复此操作。

具体操作步骤大致如下:
1)设置两个变量I、J,排序开始的时候I:=1,J:=N;
2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1];
3)从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换;
4)从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值,两者交换;
5)重复第3、4步,直到I=J;

代码实现如下:

void QuickSort(int* array, int length)
{
  if (length <= 1)
  {
    return;
  }
  
  //寻找分界值
  //快速排序使用2个下标
  int frontIndex = 1, backIndex = length - 1;
  int curIndex = 0;
  bool bBackoff = true;       //从后面后退

  while (frontIndex <= backIndex)
  {
    int frontValue = array[frontIndex];
    int backValue = array[backIndex];
    //int compareIndex = bBackoff ?backIndex:frontIndex;
    if (bBackoff)
    {
      //后退
      if (array[curIndex] > array[backIndex])
      {
        int tmpValue = array[curIndex];
        array[curIndex] = array[backIndex];
        array[backIndex] = tmpValue;
        curIndex = backIndex;
        bBackoff = !bBackoff;
      }

      backIndex--;
    }
    else
    {
      if (array[curIndex] < array[frontIndex])
      {
        int tmpValue = array[curIndex];
        array[curIndex] = array[frontIndex];
        array[frontIndex] = tmpValue;
        curIndex = frontIndex;
        bBackoff = !bBackoff;
      }

      frontIndex++;
    }
  }

  int leftLength = curIndex;   ///当右侧得数全部比 array[0]大时,curIndex 为0  会出现递归结束不了,所以  length <=1 时结束递归。 curIndex是 分界值得下标
  QuickSort(array, leftLength);
  QuickSort(array + curIndex + 1, length - leftLength - 1);
}

int main() {
    int array[] = {12,31,1,21,11,3,56,14,89,10};
    int length = sizeof(array) / sizeof(array[0]);
   
    QuickSort(array,length);
    std::for_each(array,array+length,[](int i){
        std:: cout << i << " ";
    });
    std::cout << std::endl;
    
	cout  << "test\n";
	return 0;
}

快速排序先从后面开始比较,只有交换时才换方向比较。
快速比较是不稳定得排序算法。

上一篇:电商平台轮播图组件封装


下一篇:[Web] 通用轮播图代码示例