[英]Sorting and keeping track of indexes in struct
假設我們有n
個房子。 這是一所房子:
struct Casa {
int id;
int membri;
};
我正在從membri
文件中讀取結構的大小和每個結構的成員。 第一個值是結構 ( n
) 的大小。
5
2
8
6
10
4
從文件中讀取時,我增加了 ID:
void citire(Casa house[], int n, std::ifstream & file) {
for (int i = 0; i < n; i++)
{
file >> house[i].membri;
house[i].id = i + 1;
}
}
我如何 output 基於membri
升序排列房屋 ID?
例如:
id: 1 - membri: 2
id: 2 - membri: 8
id: 3 - membri: 6
id: 4 - membri: 10
id: 5 - membri: 4
應該 output:
id: 1 - membri: 2
id: 5 - membri: 4
id: 3 - membri: 6
id: 2 - membri: 8
id: 4 - membri: 10
這是我嘗試過的,但它不起作用,我不明白為什么:
void sortareSelectie(int v[], int n) {
int i, j, min, temp;
for (i = 0; i < n - 1; i++) {
min = i;
for (j = i + 1; j < n; j++) {
if (v[j] < v[min]) min = j;
}
// swap
temp = v[min];
v[min] = v[i];
v[i] = temp;
}
}
void sort(Casa house[], int n) {
int v[10], key[10];
for (int i = 0; i < n; i++) {
v[i] = house[i].membri;
}
sortareSelectie(v, n);
for (int i = 0; i < n; i++) {
std::cout << "Membri: " << v[i] << " - ID: " << house[i].id << std::endl;
}
}
我已經看到了帶有向量、結構和 arrays 的示例。
排序后如何獲取索引排列
在 C 中排序后跟蹤數組的原始索引
排序數組並將舊索引保存在 C++
排序后獲取數組的索引?
https://www.geeksforgeeks.org/keep-track-of-previous-indexes-after-sorting-a-vector-in-c-stl/
我仍然不明白如何將其應用於我的示例。
問題是我不想也不能使用編程語言可以擁有的向量、lambda 或任何預定義的sort
function。
是的,這是給學校的。
我很抱歉,但我不知道這是如何工作的。
您可以選擇多種類型中的一種。 像冒泡排序這樣的簡單排序效率最差,然后是各種選擇排序,直到您到達更長的分區排序,效率最終得到提高。
這里有一個簡單的選擇排序示例,對您的示例結構升序進行排序。 選擇如此簡單:
void insertion_sort (struct Casa *arr, size_t size)
{
int i, j;
for (i = 0; i < (int)size; i++) {
for (j = i - 1; j >= 0; j--) {
if (arr[j].membri > arr[j + 1].membri) {
struct Casa tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
} else
break;
}
}
}
對於基於membri
的降序排序,您只需將>
更改為<
in:
if (arr[j].membri < arr[j + 1].membri) {
使用您的示例數據將其完全放在一個簡短的示例中,您將擁有:
#include <iostream>
#include <iomanip>
struct Casa {
int id;
int membri;
};
void insertion_sort (struct Casa *arr, size_t size)
{
int i, j;
for (i = 0; i < (int)size; i++) {
for (j = i - 1; j >= 0; j--) {
if (arr[j].membri > arr[j + 1].membri) {
struct Casa tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
} else
break;
}
}
}
int main (void) {
struct Casa houses[] = { {1,2}, {5,4}, {3,6}, {2,8}, {4,10} };
size_t n = sizeof houses / sizeof *houses;
insertion_sort (houses, n);
std::cout << n << " houses sorted by membri\n\n";
for (size_t i = 0; i < n; i++)
std::cout << "id: " << houses[i].id <<
" mdmbri: " << std::setw(2) << houses[i].membri << '\n';
}
示例使用/輸出
$ ./bin/struct_casa
5 houses sorted by membri
id: 1 mdmbri: 2
id: 5 mdmbri: 4
id: 3 mdmbri: 6
id: 2 mdmbri: 8
id: 4 mdmbri: 10
或者對降序進行更改:
$ ./bin/struct_casa
5 houses sorted by membri
id: 4 mdmbri: 10
id: 2 mdmbri: 8
id: 3 mdmbri: 6
id: 5 mdmbri: 4
id: 1 mdmbri: 2
如果您有任何其他問題,請仔細查看並告訴我。
我建議您使用哈希表。 以下是您提出的問題的代碼。
#include<bits/stdc++.h>
using namespace std;
int main(){
map<int,int> mymap;
int n;
cin >>n;
for(int i=0;i<n;i++){
int temp;
cin >> temp;
mymap.insert({temp,i+1});
}
auto itr= mymap.begin();
while(itr!=mymap.end()){
cout << "id: "<<(*itr).second<< " - membri: "<<(*itr).first<<endl;
itr++;
}
}
將您的選擇排序更改為通用排序:
template <typename T, typename Less>
void sortareSelectie(T v[], std::size_t n, Less less) {
for (std::size_t i = 0; i + 1 < n; i++) {
std::size_t min = i;
for (std::size_t j = i + 1; j < n; j++) {
if (less(v[j], v[min])) min = j;
}
std::swap(v[min], v[i]);
}
}
然后
bool LessByMembri(const Casa& lhs, const Casa& rhs) { return lhs.membri < rhs.membri; }
void sortAndPrint(Casa houses[], int n) {
sortareSelectie(houses, n, LessByMembri);
for (int i = 0; i < n; i++) {
std::cout << "Membri: " << houses[i].membri << " - ID: " << houses[i].id << std::endl;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.