可能是由於在實際工作用對遞歸用的實在是太少了,一時沒想到什麼好方法,所以就看了下別人的代碼。
參考地址: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);
}