快速排序

来源:互联网 发布:路由追踪命令 linux 编辑:程序博客网 时间:2024/06/14 17:23

快速排序是最流行的,也是速度最快的排序算法(C++ STL 的sort函数就是实现的快速排序);快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据序列变成有序序列。其算法的特点就是有一个枢轴(pivot),枢轴左边的元素都小于/等于枢轴所指向的元素, 枢轴右边的元素都大于枢轴指向的元素;

快速排序算法思想:
设要排序的数组是A[0], …, A[N-1],首先任意选取一个数据作为standard(通常选用数组的最后一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面(其实只要保证所有比他小的元素都在其前面,则后一条件则自动满足了),这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一次划分
目标:
找一个记录,以它的关键字/下标作为”枢轴/pivot”,凡是值小于枢轴的元素均移动至该枢轴所指向的记录之前,凡关键字大于枢轴的记录均移动至该记录之后。
致使一趟排序之后,记录的无序序列R[s..t]将分割成两部分:R[s..i-1]和R[i+1..t],且 R[j].value ≤ R[i].value ≤ R[j].value

template <typename Type>  int partitionBy3Loop(Type *array, int p, int r)  {      int i = p;      int j = r+1;    //j:超出末尾元素额下一位置      Type x = array[p];  //将最左边的元素作为枢轴元素      //将<x的元素交换到左边区域      //将>x的元素交换到右边区域      while (true)      {          //找到一个比x大(>=x)的元素          while (i < r && array[++i] < x);          //找到一个比x小(<=x)的元素          while (array[--j] > x);          if (i >= j)              break;          //交换          std::swap(array[i], array[j]);      }      //将枢轴元素与array[p]进行交换      std::swap(array[p], array[j]);      //返回枢轴      return j;  }  
0 0
原创粉丝点击