簡體   English   中英

使用quicksort算法按降序對向量進行排序

[英]Sorting vectors in a descending order using the quicksort algorithm

我是快速排序算法的新手。 遵循此處描述的原則“理解快速排序” 我嘗試編寫用於對向量進行降序排序的quicksort代碼。 下面是我的代碼和一個簡單的示例:

#include <iostream>
#include <vector>

using namespace std;

void quick_sort(vector<int> vec, int begin, int end)
{
    int i; //for left element index
    int j; //for right element index
    int pivot_idx = (begin+end)/2;
    int pivot = vec[pivot_idx]; //pivot element

    //cout<<"Pivot = "<<pivot<<endl;

    i = begin;
    j = end;
    //partition data into smaller and larger parts relative to the pivot
    while(1)
    {
       while(vec[i]>pivot)
       {
           ++i;
       }
       while(vec[j]<pivot)
       {
           ++j;
       }
       //Once the left index pass right index, partitioning is done
       if(i>=j)
       {
           break;
       }
       //otherwise do swapping
       int temp; 
       temp = vec[i];
       vec[i] = vec[j];
       vec[j] = temp;

       //keep moving indices
       i++;
       j--;
    }

    //recurse into two smaller parts
    if(begin<i-1)
    {
        quick_sort(vec, begin, i-1);
    }
    if(j+1<end)
    {
        quick_sort(vec, j+1, end);
    }
}

int main()
{  
    vector<int> v;
    v.push_back(9);
    v.push_back(5);
    v.push_back(2);
    v.push_back(6);
    v.push_back(1);
    v.push_back(11);
    v.push_back(3);

    cout<<"Before sorting:"<<endl;
    for(int i=0;i<v.size();i++)
    {
        cout<<v[i]<<endl;
    }

    quick_sort(v,0,v.size()-1);
    cout<<"After sorting:"<<endl;
    for(int i=0;i<v.size();i++)
    {
        cout<<v[i]<<endl;
    }

    return 0;
}

上面的代碼無法正常工作。 不執行排序。 我需要一些幫助來調試我的代碼以找出原因。 謝謝!

您正在按值傳遞向量,因此您對原始向量的副本進行了排序。 而是通過引用傳遞它,即將簽名更改為

void quick_sort(vector<int>& vec, int begin, int end)
                          ^^^

更新j索引有一個錯誤:

while(vec[j]<pivot){++j;}

應該

while(vec[j]<pivot){--j;}

除了通過引用傳遞以外,還有一些其他錯誤,我主要是通過使此實現更簡單來解決的。 您的功能正在嘗試執行所有操作,但未給出正確的結果。 我將分區和交換拆分為各自的功能,並使用了非常標准的quicksort功能。 現在似乎可以正常工作了:

#include <iostream>
#include <vector>
using namespace std;


void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}


int partition (vector<int> &vec, int l, int h) {
    int x = vec[h];
    int i = (l - 1);

    for (int j = l; j <= h- 1; j++) {
        if (vec[j] <= x) {
            i++;
            swap (&vec[i], &vec[j]);
        }
    }
    swap (&vec[i + 1], &vec[h]);
    return (i + 1);
}


void quick_sort(vector<int> &vec, int begin, int end) {
    if (begin < end) {
        int pivot_idx = partition(vec, begin, end);
        quick_sort(vec, begin, pivot_idx-1);
        quick_sort(vec, pivot_idx+1, end);
    }
}


int main() {
    vector<int> v;
    v.push_back(9);
    v.push_back(5);
    v.push_back(2);
    v.push_back(6);
    v.push_back(1);
    v.push_back(11);
    v.push_back(3);

    cout<<"Before sorting:"<<endl;
    for(int i=0;i<v.size();i++) {
        cout<<v[i]<<endl;
    }

    quick_sort(v,0,v.size()-1);
    cout<<"After sorting:"<<endl;
    for(int i=0;i<v.size();i++) {
        cout<<v[i]<<endl;
    }

    return 0;
}

我希望這有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM