可能是由于在实际工作用对递归用的实在是太少了,一时没想到什么好方法,所以就看了下别人的代码。
参考地址:http://www.cnblogs.com/eniac12/p/5329396.html
快速排序的基本原理:选择一个数列中的元素作为一个分界线把数列分为两个部分(大于此数的部分和小于此数的部分),然后再把这两部分做前面相同的处理,直到数列无法再分时,排序结束。(递归的使用)代码如下:
void MainWindow::Swap(int A[], int i, int j)
{
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
int MainWindow::Partition(int A[], int left, int right) // 划分函数
{
int pivot = A[right]; // 这里每次都选择最后一个元素作为基准
int tail = left - 1; // tail为小于基准的子数组最后一个元素的索引
for (int i = left; i < right; i++) // 遍历基准以外的其他元素
{
if (A[i] <= pivot) // 把小于等于基准的元素放到前一个子数组末尾
{
Swap(A, ++tail, i);
}
}
Swap(A, tail + 1, right); // 最后把基准放到前一个子数组的后边,剩下的子数组既是大于基准的子数组
// 该操作很有可能把后面元素的稳定性打乱,所以快速排序是不稳定的排序算法
return tail + 1; // 返回基准的索引
}
void MainWindow::QuickSort(int A[], int left, int right)
{
if (left >= right)
return;
int pivot_index = Partition(A, left, right); // 基准的索引
QuickSort(A, left, pivot_index - 1);
QuickSort(A, pivot_index + 1, right);
}