快速排序采用分治递归的思想,首先选取一个参考元素(比如第一个元素),然后将剩余的元素分成两部分:一部分所有元素都小于参考元素,一部分所有元素都大于参考元素,然后将参考元素插入到分界点;对于分开的两部分,递归采用同样的方法获取分类,最终将获取到完整排序的数列。
C++实现代码:
#include <iostream>
#include <vector>
using namespace std;
template<typename T>
void QuickSort(int minIdx, int maxIdx, vector<T> &vec);
int main()
{
int arr[] = { 8, 3, 10, 49, 2, 6, 13, 5, 14, 7, 51, 53, 55 };
vector<int> vec(&arr[0], &arr[13]);
QuickSort(1, vec.size(), vec);
for (int vIdx = 0; vIdx < vec.size(); vIdx++)
{
cout << "value in " << vIdx << " is " << vec[vIdx] << endl;
}
return 0;
}
template<typename T>
void QuickSort(int minIdx, int maxIdx, vector<T> &vec)
{
int VSize = vec.size();
if ((VSize < 1) || (minIdx <= 0) || (minIdx > VSize) || (maxIdx < 0) || (maxIdx > VSize) || (maxIdx <= minIdx))
return;
if (1 == VSize)
{
cout << "Only one element in vector: " << vec[0] << endl;
return;
}
if (minIdx == maxIdx - 1)
{
if (vec[minIdx - 1] > vec[minIdx])
{
vec[minIdx - 1] ^= vec[minIdx];
vec[minIdx] ^= vec[minIdx - 1];
vec[minIdx - 1] ^= vec[minIdx];
}
}
else
{
int firstPos = minIdx;
for (int vIdx = minIdx; vIdx < maxIdx; vIdx++)
{
if (vec[minIdx - 1] > vec[vIdx])
{
if (firstPos < vIdx)
{
vec[firstPos] ^= vec[vIdx];
vec[vIdx] ^= vec[firstPos];
vec[firstPos] ^= vec[vIdx];
}
firstPos++;
}
}
if ((minIdx < firstPos) || (firstPos > maxIdx))
{
vec[firstPos - 1] ^= vec[minIdx - 1];
vec[minIdx - 1] ^= vec[firstPos - 1];
vec[firstPos - 1] ^= vec[minIdx - 1];
}
QuickSort(minIdx, firstPos - 1, vec);
QuickSort(firstPos + 1, maxIdx, vec);
}
return;
}