如何更改此计数排序以从最大值到最小值进行排序?我不知道该怎么做。我无法以相反的顺序编写数组或在排序后更改数组的顺序。它必须在排序算法中。这是一个代码。
#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;
}
答案 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