快速排序的主要思想就是:将待排序数组以某一个元素为阈值分为两个子列,一个子列包含所有比改阈值小的元素,另一个子列反之。这样只要将这两个子列排好序,整个数组也就排好序了。这里有一个关键的子过程就是划分的过程Partition,一般可以选择数组中任意的元素作为划分阈值,这里选择的是数组中最左端的元素。

#include <iostream>
#include <vector>
#include <cassert>

using namespace std;

template <class T>
int Partion(T *input, int len)

...{
assert(input != NULL);
T temp = input[0];
int i = 0;
int j = len - 1;

/**//* 找到枢纽应在的位置*/
while (i < j)

...{

/**//* 从后往前找到比枢纽小的元素 */
while (input[j] > temp && i < j)

...{
j--;
}
if (i >= j)

...{
break;
}

/**//* 从前往后找比枢纽大的元素 */
while (input[i] < temp && i < j)

...{
i++;
}
if (i >= j)

...{
break;
}
swap(input[i], input[j]);
}

swap(input[i], temp);

/**//* 返回枢纽所在的位置 */
return i;
}


/**//* quick sort algorithm */
template <class T>
void QuickSort(T *input, int len)

...{
assert(input != NULL);
int pivot;
if (len <= 1)

...{
return;
}
pivot = Partion(input, len);
QuickSort(input, pivot);
QuickSort(input + pivot + 1, len - pivot - 1);
}

int main(void)

...{

int a[] = ...{89, -32, 1, 3, 5, 45, 34, 43};
QuickSort(a, sizeof(a)/sizeof(int));
for (int i =0; i < sizeof(a)/sizeof(int); i++)

...{
cout << a[i] << endl;
}

return 0;
}
Partition使用了二分查找类似的思想:使用两个索引器从数组的两端进行遍历,左边的索引器遇到比阈值大的元素停止,右边的索引器遇到比自己小的元素停止,然后交换这两个元素,依次循环。这样数组就划分为了比该阈值大和小(含等于)两个子列了。






















































































