簡體   English   中英

排序和跟蹤結構中的索引

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM