计数排序(从最大到最小)

时间:2018-04-17 19:24:59

标签: c++ sorting counting

如何更改此计数排序以从最大值到最小值进行排序?我不知道该怎么做。我无法以相反的顺序编写数组或在排序后更改数组的顺序。它必须在排序算法中。这是一个代码。

#include<iostream>
#include<stdio.h>
#include<time.h>
using namespace std;

int main()
{
    int n;
    int k;
    cout<<"number of elements" <<n<<endl;
    cin>>n;
    cout<<"max number"<<endl;
    cin>>k;
    int tab[n];
    cout<<"array before sort :"<<endl;
    for(int i=0; i<n; i++)
    {
        cin>>tab[i];    
    }   
    cout<<"array after sort"<<endl;
    int tabp[k];
    int tabw[n];
    for(int i=0; i<k; i++)
    {
        tabp[i]=0;
    }   
    for(int i=0; i<n; i++)
    {
        tabp[tab[i]]=tabp[tab[i]]+1;
    }
    for(int i=1; i<=k;  i++)
    {
        tabp[i]+=tabp[i-1];
    }
    for(int i=0; i<n; i++) 
    {
        tabw[tabp[tab[i]]-1]=tab[i];
        tabp[tab[i]]=tabp[tab[i]]-1;
    }
    for(int i=0;i<n;i++)
    {
        cout<<tabw[i]<<" ";
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

您应该在算法模块中使用标准模板库(STL)中的方法。有一个很好的方法 std :: sort 可以帮到你。您将容器数据传递给它,第三个参数可以接受对给定容器进行排序的方式。在这里,您可以使用STL中功能模块的功能对象。您需要查看 std :: less&lt;&gt; std :: greater&lt;&gt; 。他们将按升序或降序对数组进行排序。您也可以通过自己的功能按照自己的方式进行排序。

有一种有用的方法 std :: reverse ,您可以在容器中反转元素的顺序。例如,如果您需要按升序和降序排序,则可以先按升序排序,然后调用std :: reverse以获得降序结果。

// Sort by ascending
std::sort(tabw, tabw+n, std::less<int>());

//Reverse current array
std::reverse(tabw, tabw+n);

默认初始化数组数据的简短示例:

#include <iostream>
#include <algorithm>
#include <functional>

void TraceArr( int arr[], const int len, ostream& out )
{
    std::copy(arr, arr+len, ostream_iterator<int>(out,", "));
    std::cout << std::endl;
}

int main(int argc, const char * argv[]) {
    const int SIZE = 10;
    int arr[SIZE] {2,3,2,4,6,4,2,4,6,2};

    // Sort by ascending
    std::sort(arr, arr+SIZE, std::less<int>());
    TraceArr(arr, SIZE, std::cout);//2, 2, 2, 2, 3, 4, 4, 4, 6, 6,

    // Sort by descending
    std::sort(arr, arr+SIZE, std::greater<int>());
    TraceArr(arr, SIZE, std::cout);//6, 6, 4, 4, 4, 3, 2, 2, 2, 2,

    return 0;
}

如果您希望我在您的代码中显示它,那么它看起来像这样:

#include <iostream>
#include <algorithm>
#include <functional>
#include<stdio.h>
#include<time.h>

using namespace std;

void TraceArr( int arr[], const int len, ostream& out )
{
    std::copy(arr, arr+len, ostream_iterator<int>(out,", "));
    std::cout << std::endl;
}

int main()
{
    int n = 0;
    int k = 0;
    cout<<"number of elements" <<n<<endl;
    cin>>n;
    cout<<"max number"<<endl;
    cin>>k;
    int tab[n];
    cout<<"array before sort :"<<endl;
    for(int i=0; i<n; i++)
    {
        cin>>tab[i];
    }
    cout<<"array after sort"<<endl;
    int tabp[k];
    int tabw[n];
    for(int i=0; i<k; i++)
    {
        tabp[i]=0;
    }
    for(int i=0; i<n; i++)
    {
        tabp[tab[i]]=tabp[tab[i]]+1;
    }
    for(int i=1; i<=k;  i++)
    {
        tabp[i]+=tabp[i-1];
    }
    for(int i=0; i<n; i++)
    {
        tabw[tabp[tab[i]]-1]=tab[i];
        tabp[tab[i]]=tabp[tab[i]]-1;
    }

    TraceArr(tabw, n, std::cout);

    cout<<"array after sort with stl:"<<endl;

    // Sort by ascending
    std::sort(tabw, tabw+n, std::less<int>());
    TraceArr(tabw, n, std::cout);

    // Sort by descending
    std::sort(tabw, tabw+n, std::greater<int>());
    TraceArr(tabw, n, std::cout);

    cout<<"array after reverse with stl:"<<endl;
    //Reverse current array
    std::reverse(tabw, tabw+n);
    TraceArr(tabw, n, std::cout);


    return 0;
}

结果是:

number of elements0
5
max number
10
array before sort :
8
5
7
9
1
array after sort
1, 5, 7, 8, 9, 
array after sort with stl:
1, 5, 7, 8, 9, 
9, 8, 7, 5, 1, 
array after reverse with stl:
1, 5, 7, 8, 9, 
Program ended with exit code: 0

可能你根本不需要tabp tabw数组?不完全理解他们的必要,你可以在输入带有tab数组的数据之后使用STL进行排序,比如这个

std::sort(tab, tab+n, std::less<int>()); // tab keeps sorted array ascending
std::sort(tab, tab+n, std::greater<int>()); // tab keeps sorted array descending