计数排序(从最大值到最小值)
Counting sort (from the maximum to minimum)
如何更改此计数排序以从最大值到最小值进行排序?我不知道该怎么做。我无法以相反的顺序写入数组或在排序后更改数组的顺序。它必须在排序的算法中。这是一个代码。
#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
相关文章:
- 查找矩阵C++中每一列和每一行的最小和最大元素
- 如何在数组中交换最小和最大的位置?
- 需要使用模板查找数组的第二个最小和最小值
- 使用 std::min_element、std::max_element 查找矢量中的最小和最大元素
- 为什么我不能使用最小和最大这两个词作为变量名称?
- 在运行时为随机分布类成员设置最小和最大边界?
- 如何使用气泡排序从最小到最大对 4 个数组进行排序? C++
- 如何拒绝 cin 中的字符输入并定义最小和最大整数值
- 类型 *阵列的最小或最大值的类功能 *
- C++ 100 万个变量名称的最小和最大变量名称长度是多少
- 想要以正弦曲线的形式在循环中连续将值从最小变为最大
- 数组内存地址总是按最小到最大的顺序排列吗
- 使用向量而不是数组从最小到最大对数字进行排序C++
- 在 c++ 中给出两个整数向量(大小和类型相同),我想从最小到最大元素对一个进行排序,并更改第二个向量的顺序
- 在用户定义结构的向量中查找最小和最大元素的索引
- 二进制搜索,用于查找排序数组中比给定值最小和最大的元素
- c++中的函数如何以最小的复制返回值或引用?
- 我如何确定我可以传递给编译器选项的最小和最大值
- 如何为每个光栅带设置最小和最大颜色值(使用GDAL)
- 在c++中最小化分支-如果值是非零则递增