排序算法6:快速排序(quick sort)

可能是由於在實際工作用對遞歸用的實在是太少了,一時沒想到什麼好方法,所以就看了下別人的代碼。

參考地址: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);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章