C++中的快速排序(使用vector和數組的不同)


1.快速排序是最最基本的排序算法之一,時間復雜度是O(nlog2(n))

基本思想:分治法+遞歸

假設key為該序列的第一個元素,從后往前遍歷,找到第一個小於key值的元素,將該元素賦值給左邊的起始值,再從前往后遍歷,找到第一個大於key值的元素,將其賦值給剛才右邊第一個小於key值的值,當low<high,則不斷遞歸,知道有序為止.

在用數組int num[]和C++的vector傳遞地址時,vector需要傳引用,否則,沒法得到正確地址,因為vector本質上是一個類對象,因此傳值會得不到正確結果,而數組會退化為指針,因此可以直接傳值.

template<typename datatype>
void myquicksort(vector<datatype> &vec, int low, int high)//必須傳引用,否則出錯,因為vector是一個類對象
{
    if (low < high)
    {
        int l = low;
        int r = high;
        datatype key = vec[l];//記錄key值

        while (l < r)
        {
            while (l < r&&key <= vec[r])//從右往左遍歷,找到第一個小於key的元素
                --r;
            vec[l] = vec[r];
            while (l < r&&key >= vec[l])//從左往右遍歷,找到第一個大於key值的元素
                ++l;
            vec[r] = vec[l];
        }
        vec[l] = key;//其實此時l=r

        myquicksort(vec, low, l-1);
        myquicksort(vec, r + 1, high);
    }
}
int main2()
{
    const int len = 30;//定義一個常量
    vector<int>data;//創建一個vector,存儲int類型的元素
    for (int i = 0; i < len; i++)
    {
        data.push_back(rand() % 100);
        cout << (data.at(i)) << "\t";
        if ((i + 1) % 10 == 0)
            cout << endl;
    }

    clock_t start = clock();//使用clock函數需要包含頭文件#include<ctime>
    myquicksort(data, 0, len - 1);
    clock_t end = clock();
    cout << "排序完成,總共用時:" << (end - start)*1.0 / CLOCKS_PER_SEC << endl;//#define CLOCKS_PER_SEC  1000
    for (int i = 0; i < len; i++)
    {
        cout << (data.at(i)) << "\t";
        if ((i + 1) % 10 == 0)
            cout << endl;
    }

    system("pause");
    return 0;
}

2.使用數組來傳值:

void myquicksort2(int a[], int low, int high)//數組作為函數參數,沒有副本機制,退化為指針
{
    if (low >= high)//遞歸終止條件
        return;
    else
    {
        int l = low, h = high;
        int key = a[l];
        while (l<h)
        {
            while (l < h&&a[h] >= key)
                --h;
            a[l] = a[h];
            while (l < h&&a[l] <= key)
                ++l;
            a[h] = a[l];
        }
        a[l] = key;
        myquicksort2(a, low, l - 1);
        myquicksort2(a, l + 1, high);
    }
}
int main()
{
    const int len = 30;
    int num[len];
    for (int i = 0; i < len; i++)
    {
        num[i] = rand() % 100;
        cout << num[i] << "\t";
        if ((i + 1) % 10 == 0)
            cout << endl;
    }
    clock_t t1 = clock();
    myquicksort2(num, 0, len - 1);
    clock_t t2 = clock();
    cout << "排序完成,總共用時:" << (t2 - t1)*1.0 / CLOCKS_PER_SEC << endl;
    for (int i = 0; i < len; i++)
    {
        cout << num[i] << "\t";
        if ((i + 1) % 10 == 0)
            cout << endl;
    }
    system("pause");
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM