排序算法-快速排序(直观总结分析)

来源:互联网 发布:mmd导入镜头数据 编辑:程序博客网 时间:2024/06/11 19:45

快速排序算法是比较经典的排序算法。

但其中心思想还是比较简单的,就是“挖坑”和“填坑”的过程。

这里的“坑”经常会被随机化,以防止快排的最坏情况出现。当然,我们拿到一个数列后,也可以先将该数列整体随机化,从而避免每次都要随机“选坑”。

今天重新复习了一下,也总结了不同形式的快排~总结如下:


1. 常见的快速排序形式:

#include <iostream>using namespace std;void quickSort(int *array, int Begin, int End){  if(Begin<End)  {    int begin = Begin;    int end = End;    int temp = array[end];//挖坑     while(begin<end)    {      while(begin<end && array[begin]<=temp) begin++;       if(begin<end) array[end--] = array[begin];  //从前向后填坑       while(begin<end && array[end]>=temp) end--;      if(begin<end) array[begin++] = array[end];  //从后向前填坑     }    array[begin]=temp; //填上“中间”的坑         quickSort(array, Begin, begin-1);//递归     quickSort(array, begin+1, End);  }}//输出数组 void printArray(int *array, int length){  for(int i=0; i<length; i++)    cout<<array[i]<<"\t";  cout<<endl;}int main(){  int array[5]={4, 2, 1, 7, 5};  printArray(array, 5);    quickSort(array, 0, 5);   printArray(array, 5);    system("pause");  return 0;}

2.另一种形式(见《剑指offer》P64)

int Partion(int data[], int length, int start, int end){  if(data == NULL || length<=0 || start<0 || end >=length)    throw new std::exception("Invalid Parameters");    int index = RandomInRange(start, end);//挖坑   Swap(&data[index], &data[end]);    int small = start-1; //small变量的设置是它与传统快排最大的不同之处  for(index = start; index < end; ++ index)  {    if(data[index] < data[end])    {      ++small; //small总是指向比“坑”中数字大的前一个数字      if(small != index)        Swap(&data[index], &data[small]);    }  }  ++small;  Swap(&data[small], &data[end]);    return small; } void QuickSort(int data[], int length, int start, int end){  if(start == end) return;    int index = Partion(data, length, start, end);  if(index > start) QuickSort(data, length, start, index-1);  if(index < end)   QuickSort(data, length, index+1, end);}



0 0