{"id":19671565,"url":"https://github.com/ikauematos/data-structurec","last_synced_at":"2025-02-27T05:13:27.076Z","repository":{"id":191046191,"uuid":"683822013","full_name":"iKaueMatos/Data-structureC","owner":"iKaueMatos","description":"Hello devs okay with you guys? this repository aims to show a little about the sorting methods using C to apply the ordering methods","archived":false,"fork":false,"pushed_at":"2023-09-27T21:06:40.000Z","size":529,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-10T03:41:18.098Z","etag":null,"topics":["c","data-structures","language"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iKaueMatos.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-08-27T20:02:08.000Z","updated_at":"2023-08-27T22:23:24.000Z","dependencies_parsed_at":null,"dependency_job_id":"b6bac4c7-3e7a-4cee-9adf-5ebcfe6c4ce4","html_url":"https://github.com/iKaueMatos/Data-structureC","commit_stats":null,"previous_names":["ikauematos/data-structurec"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iKaueMatos%2FData-structureC","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iKaueMatos%2FData-structureC/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iKaueMatos%2FData-structureC/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iKaueMatos%2FData-structureC/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iKaueMatos","download_url":"https://codeload.github.com/iKaueMatos/Data-structureC/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240981559,"owners_count":19888346,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c","data-structures","language"],"created_at":"2024-11-11T17:09:13.426Z","updated_at":"2025-02-27T05:13:27.052Z","avatar_url":"https://github.com/iKaueMatos.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Métodos de Ordenação\n\nEste documento fornece uma visão geral dos diferentes métodos de ordenação, algoritmos que organizam um conjunto de elementos em uma ordem específica. Cada método possui suas próprias características, eficiência e cenários de uso.\n\n## Métodos Disponíveis\n\nO repositório inclui implementações dos seguintes métodos de ordenação:\n\n1. **Bubble Sort:** O Bubble Sort é um método simples de ordenação. Ele percorre a lista várias vezes, comparando pares de elementos adjacentes e trocando-os se estiverem fora de ordem. Esse processo é repetido até que nenhum elemento precise mais ser trocado. Apesar de sua simplicidade, o Bubble Sort tem uma baixa eficiência para listas grandes.\n\n```c\n   #include \u003cstdio.h\u003e\nvoid bubbleSort(int arr[], int n) {\n    for (int i = 0; i \u003c n - 1; i++) {\n        for (int j = 0; j \u003c n - i - 1; j++) {\n            if (arr[j] \u003e arr[j + 1]) {\n                int temp = arr[j];\n                arr[j] = arr[j + 1];\n                arr[j + 1] = temp;\n            }\n        }\n    }\n}\n\nint main() {\n    int arr[] = {64, 34, 25, 12, 22, 11, 90};\n    int n = sizeof(arr) / sizeof(arr[0]);\n    \n    printf(\"Array antes da ordenação:\\n\");\n    for (int i = 0; i \u003c n; i++) {\n        printf(\"%d \", arr[i]);\n    }\n    printf(\"\\n\");\n\n    bubbleSort(arr, n);\n\n    printf(\"Array após a ordenação:\\n\");\n    for (int i = 0; i \u003c n; i++) {\n        printf(\"%d \", arr[i]);\n    }\n    printf(\"\\n\");\n    return 0;\n}\n```\n\n2. **Insertion Sort:** O Insertion Sort funciona da mesma forma que organizaríamos um baralho de cartas: um elemento é removido da lista não ordenada e inserido na posição correta na lista ordenada. Ele é eficiente para pequenas listas ou para situações em que a lista já está quase ordenada.\n\n```c\n#include \u003cstdio.h\u003e\n\nvoid insertionSort(int arr[], int n) {\n    for (int i = 1; i \u003c n; i++) {\n        int key = arr[i];\n        int j = i - 1;\n        \n        while (j \u003e= 0 \u0026\u0026 arr[j] \u003e key) {\n            arr[j + 1] = arr[j];\n            j--;\n        }\n        \n        arr[j + 1] = key;\n    }\n}\n\nint main() {\n    int arr[] = {64, 34, 25, 12, 22, 11, 90};\n    int n = sizeof(arr) / sizeof(arr[0]);\n    \n    printf(\"Array antes da ordenação:\\n\");\n    for (int i = 0; i \u003c n; i++) {\n        printf(\"%d \", arr[i]);\n    }\n    printf(\"\\n\");\n\n    insertionSort(arr, n);\n\n    printf(\"Array após a ordenação:\\n\");\n    for (int i = 0; i \u003c n; i++) {\n        printf(\"%d \", arr[i]);\n    }\n    printf(\"\\n\");\n    \n    return 0;\n}\n```\n3. **Selection Sort:** O Selection Sort seleciona repetidamente o menor elemento da lista não ordenada e o coloca no início da lista ordenada. A cada passo, o menor elemento é identificado e trocado com o elemento na posição atual de iteração. Apesar de sua simplicidade, o Selection Sort também é ineficiente para listas grandes.\n```c\n#include \u003cstdio.h\u003e\n\nvoid selectionSort(int arr[], int n) {\n    for (int i = 0; i \u003c n - 1; i++) {\n        int minIndex = i;\n        \n        for (int j = i + 1; j \u003c n; j++) {\n            if (arr[j] \u003c arr[minIndex]) {\n                minIndex = j;\n            }\n        }\n        \n        if (minIndex != i) {\n            int temp = arr[i];\n            arr[i] = arr[minIndex];\n            arr[minIndex] = temp;\n        }\n    }\n}\n\nint main() {\n    int arr[] = {64, 34, 25, 12, 22, 11, 90};\n    int n = sizeof(arr) / sizeof(arr[0]);\n    \n    printf(\"Array antes da ordenação:\\n\");\n    for (int i = 0; i \u003c n; i++) {\n        printf(\"%d \", arr[i]);\n    }\n    printf(\"\\n\");\n\n    selectionSort(arr, n);\n\n    printf(\"Array após a ordenação:\\n\");\n    for (int i = 0; i \u003c n; i++) {\n        printf(\"%d \", arr[i]);\n    }\n    printf(\"\\n\");\n    \n    return 0;\n}\n```\n5. **Merge Sort:** O Merge Sort é um algoritmo de ordenação recursivo que divide a lista em sublistas menores, ordena cada sublista e depois mescla as sublistas ordenadas para obter a lista final ordenada. É um método eficiente e estável, adequado para listas de tamanho moderado.\n\n```c\n   #include \u003cstdio.h\u003e\n\nvoid merge(int array[], int left, int middle, int right) {\n    int n1 = middle - left + 1;\n    int n2 = right - middle;\n\n    // Criação de arrays temporárias para as subarrays esquerda e direita\n    int leftSubarray[n1], rightSubarray[n2];\n\n    // Copiar os elementos para as arrays temporárias\n    for (int i = 0; i \u003c n1; i++)\n        leftSubarray[i] = array[left + i];\n    for (int j = 0; j \u003c n2; j++)\n        rightSubarray[j] = array[middle + 1 + j];\n\n    // Mesclar as subarrays temporárias de volta na array original\n    int i = 0; // Índice da subarray esquerda\n    int j = 0; // Índice da subarray direita\n    int k = left; // Índice da array final mesclada\n\n    while (i \u003c n1 \u0026\u0026 j \u003c n2) {\n        if (leftSubarray[i] \u003c= rightSubarray[j]) {\n            array[k] = leftSubarray[i];\n            i++;\n        } else {\n            array[k] = rightSubarray[j];\n            j++;\n        }\n        k++;\n    }\n\n    // Copiar os elementos restantes da subarray esquerda, se houver\n    while (i \u003c n1) {\n        array[k] = leftSubarray[i];\n        i++;\n        k++;\n    }\n\n    // Copiar os elementos restantes da subarray direita, se houver\n    while (j \u003c n2) {\n        array[k] = rightSubarray[j];\n        j++;\n        k++;\n    }\n}\n\nvoid mergeSort(int array[], int left, int right) {\n    if (left \u003c right) {\n        // Encontrar o meio da array\n        int middle = left + (right - left) / 2;\n\n        // Ordenar a metade esquerda\n        mergeSort(array, left, middle);\n\n        // Ordenar a metade direita\n        mergeSort(array, middle + 1, right);\n\n        // Mesclar as duas metades ordenadas\n        merge(array, left, middle, right);\n    }\n}\n\nvoid printArray(int array[], int size) {\n    for (int i = 0; i \u003c size; i++)\n        printf(\"%d \", array[i]);\n    printf(\"\\n\");\n}\n\nint main() {\n    int array[] = {12, 11, 13, 5, 6, 7};\n    int arraySize = sizeof(array) / sizeof(array[0]);\n\n    printf(\"Array original:\\n\");\n    printArray(array, arraySize);\n\n    mergeSort(array, 0, arraySize - 1);\n\n    printf(\"\\nArray ordenada:\\n\");\n    printArray(array, arraySize);\n\n    return 0;\n}\n```\n7. **Quick Sort:** O Quick Sort é outro algoritmo de ordenação recursivo que seleciona um elemento como \"pivot\" e rearranja a lista de forma que todos os elementos menores que o pivot estejam à esquerda e os maiores à direita. Esse processo é repetido recursivamente nas sublistas resultantes. O Quick Sort é geralmente rápido e eficiente, mas pode ser afetado pelo pior caso em algumas implementações.\n8. **Heap Sort:** O Heap Sort organiza os elementos como uma estrutura de dados chamada heap, que é uma árvore binária especial. Os elementos são inseridos na heap e, em seguida, removidos um por um na ordem desejada. O Heap Sort é eficiente e tem uma complexidade de tempo previsível, mas pode ser menos intuitivo de implementar do que outros métodos.\n9. **Counting Sort:** O Counting Sort é eficiente quando a faixa de valores a serem ordenados é pequena em relação ao tamanho da lista. Ele conta o número de elementos menores ou iguais a cada valor possível e, em seguida, usa essas contagens para posicionar cada elemento na posição correta na lista ordenada.\n10. **Bucket Sort:** O Bucket Sort é adequado quando os valores a serem ordenados estão uniformemente distribuídos. Ele distribui os elementos em \"baldes\" com intervalos específicos, ordena cada balde individualmente e, em seguida, combina os baldes ordenados para obter a lista final ordenada.\n11. **Radix Sort:** O Radix Sort ordena os elementos considerando cada dígito individualmente, do dígito menos significativo para o mais significativo. Ele pode ser utilizado para ordenar inteiros, strings ou outros tipos de dados que possam ser decompostos em dígitos.\nCada método de ordenação tem suas próprias vantagens e desvantagens, e a escolha do método certo depende do contexto e dos requisitos específicos do problema a ser resolvido. É importante considerar a eficiência e a estabilidade do método, bem como o tamanho dos dados a serem ordenados.\n12. **Tim Sort:** O Tim Sort é uma variação do Merge Sort que visa combinar os benefícios do Merge Sort e do Insertion Sort. Ele divide a lista em blocos pequenos, ordena esses blocos usando o Insertion Sort e, em seguida, mescla os blocos de maneira eficiente usando o Merge Sort. O Tim Sort é usado em várias linguagens de programação modernas devido à sua eficiência e desempenho em muitos casos.\n13. **Shell Sort:** O Shell Sort é uma extensão do Insertion Sort que compara elementos distantes uns dos outros e, gradualmente, reduz o intervalo entre os elementos a serem comparados. Isso ajuda a mover elementos maiores para posições corretas mais rapidamente, melhorando a eficiência do algoritmo em comparação com o simples Insertion Sort.\n14. **Natural Merge Sort:** O Natural Merge Sort é utilizado para ordenar listas que já estão parcialmente ordenadas. Ele identifica as subsequências ordenadas na lista e mescla essas subsequências de forma eficiente, minimizando a quantidade de operações necessárias.\n15. **Ordenação Externa:** Os métodos de ordenação mencionados até agora lidam com listas que podem ser mantidas inteiramente na memória. No entanto, quando se trata de ordenar grandes volumes de dados que não cabem na memória principal, é necessário utilizar algoritmos de ordenação externa. Esses algoritmos, como o External Merge Sort, fazem uso de leituras e gravações em disco para organizar os dados.\n16. **Ordenação Estável vs. Não Estável:** Alguns métodos de ordenação são estáveis, o que significa que eles preservam a ordem relativa dos elementos iguais. Outros métodos não são estáveis, o que significa que a ordem relativa dos elementos iguais pode ser alterada após a ordenação. A estabilidade é importante em certos casos, como quando você precisa ordenar por vários critérios em sequência.\n17. **Escolhendo o Método Adequado:** A escolha do método de ordenação adequado depende das características dos dados a serem ordenados, como tamanho da lista, distribuição dos valores, necessidade de estabilidade e restrições de memória. É importante analisar as propriedades do problema antes de decidir qual método utilizar, buscando o equilíbrio entre eficiência e facilidade de implementação.\nLembre-se de que muitas linguagens de programação já possuem funções ou bibliotecas que implementam esses métodos de ordenação de maneira otimizada, então, em muitos casos, você não precisará implementá-los do zero.\n\n## Escolhendo um Método\n\nA seleção do método de ordenação adequado depende das características dos dados e dos requisitos do problema. Leve em consideração o tamanho da lista, a distribuição dos valores e a necessidade de estabilidade. Muitas linguagens de programação possuem bibliotecas com implementações otimizadas de métodos de ordenação.\n\n## Como Usar\n\n1. Escolha o método de ordenação apropriado com base no seu caso de uso.\n2. Navegue até o diretório correspondente para ver a implementação e a explicação detalhada.\n3. Você pode usar as implementações como referência ou integrá-las aos seus projetos.\n\n## Contribuição\n\nSe você quiser contribuir, sinta-se à vontade para adicionar mais métodos de ordenação, otimizações ou exemplos de uso. Certifique-se de seguir as diretrizes de contribuição do repositório.\n\n## Licença\n\nSem licença ...\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fikauematos%2Fdata-structurec","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fikauematos%2Fdata-structurec","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fikauematos%2Fdata-structurec/lists"}