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

Counting sort (from the maximum to minimum)

本文关键字:最小值 最大值 排序      更新时间:2023-10-16

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

#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;
}

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

有一个有用的方法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

也许你根本不需要标签标签数组?不完全了解它们的必要性,您可以在使用选项卡数组输入数据后借助 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