排列数组,以便执行给定操作后获得递增顺序

data structurec++programming

您必须使用适当的排序算法,才能使用指定的操作按递增顺序组织数组。首先根据数组大小和数据属性确定最有效的方法。冒泡排序、归并排序和快速排序是常用排序算法的示例。反复​​应用所选算法,根据元素之间的比较来移动元素的位置,直到数组按升序排列。算法的有效性取决于它耗时的程度,最好的算法可以更快地产生结果。通过仔细使用所选的排序方法,可以有效地按升序排列数组,从而更易于操作和分析数据。

使用的方法

  • 冒泡排序

  • 归并排序

  • 快速排序

冒泡排序

冒泡排序是一种简单的排序技术,可用于按升序排列数组。它通过反复比较附近的数组元素来查看它们是否处于正确的顺序,如果不正确,则交换它们。重复该过程,直到整个数组都已排序。您可以使用此排序方法快速按升序排列数组。但是,与归并排序或快速排序等替代排序算法相比,这些算法对于较大的数据集具有更高的时间复杂度,而冒泡排序对于较大的数组则效率较低,因为其最坏情况的时间复杂度为 O(n2)。

算法

  • 从未排序元素的数组开始。

  • 应该比较第一个和第二个元素。如果第一个元素大于第二个元素,则交换这两个元素。

  • 如有必要,对以下相邻元素对重复比较和交换过程。

  • 对每对相邻元素重复此过程,直到数组末尾。

  • 数组中最大的成员在遍历一次后最终会"冒泡"到最后一个位置。

  • 对剩余的每个数组元素(除最后一个排序的元素外)重复步骤 2 到 5,直到整个数组按升序排列。

  • 数组现在按升序排列,表示排序操作结束。

示例

#include <iostream>

template <typename T, size_t N>
void bubbleSort(T (&arr)[N]) {
    for (size_t i = 0; i < N - 1; ++i) {
        for (size_t j = 0; j < N - i - 1; ++j) {
            if (arr[j] > arr[j + 1]) {
                std::swap(arr[j], arr[j + 1]);
            }
        }
    }
}

int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    bubbleSort(arr);
    for (int num : arr) {
        std::cout << num << " ";
    }
    return 0;
}

输出

11 12 22 25 34 64 90 

归并排序

归并排序使用分而治之的策略按升序排列数组。它将数组分成两半,然后分别对每个子数组进行递归排序。然后将排序后的子数组合并在一起,确保元素按升序排列。此操作完成后,数组将完全排序。归并排序是一种实现数组升序的有效方法,因为它确保所有实例的时间复杂度为 O(n log n),从而使数据管理和分析更简单。

算法

  • 如果数组仅包含一个元素或为空,则表示数组已排序。将数组恢复到其原始形式。

  • 将数组分成两个相等的部分。

  • 对每个部分迭代应用合并排序以独立地对它们进行排序。

  • 重建两个排序好的部分,使组件按升序排列。

    比较两个部分中的元素,将较小的元素添加到临时组合数组中。

    继续处理子数组中较小元素所在的下一个元素。

    直到两个部分合并,再次进行比较和合并。

  • 用合并后的数组替换原始数组。

  • 对整个数组进行排序后继续递归。

  • 合并排序技术已成功用于对数组进行升序排序顺序。

示例

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

void mergeSort(int arr[], int left, int right);
void merge(int arr[], int left, int mid, int right);

int main() {
    const int size = 10;
    int arr[size];

    srand(time(0));
    cout << "Original Array: ";
    for (int i = 0; i < size; i++) {
        arr[i] = rand() % 100;
        cout << arr[i] << " ";
    }

    mergeSort(arr, 0, size - 1);

    cout << "\nSorted Array: ";
    for (int i = 0; i < size; i++) {
        cout << arr[i] << " ";
    }

    return 0;
}

void mergeSort(int arr[], int left, int right) {
}
void merge(int arr[], int left, int mid, int right) {
}

输出

Original Array: 64 10 16 73 95 69 25 68 11 45 
Sorted Array: 64 10 16 73 95 69 25 68 11 45 

快速排序

根据称为快速排序的常见排序技术,通过从数组中选择一个"枢轴"元素,将数组拆分为较小和较大的子数组。然后该方法迭代地对这些子数组进行排序。一旦完成此操作,数组就会完全排序。快速排序对于大数组很有效,因为它的平均时间复杂度为 O(n log n)。通过仔细使用快速排序,可以按升序重新排列数组,使数据处理和分析更容易。

算法

  • 从列表中选择一个重要元素;这个元素可能是任何一个,但通常是第一个、最后一个或中间的成员。

  • 重新排列数组的项目以创建一个分区,将较小的元素放在左边,将较大的元素放在右边。

  • 以递归方式将快速排序应用于左侧和右侧分区(分别小于和大于枢轴的项目)。

  • 对每个分区重复该过程,直到子数组不包含任何元素或仅包含一个元素。

  • 在递归展开时,子数组被连接起来以生成最终的排序数组。

示例

#include <iostream>
#include <vector>

int partition(std::vector<int>& arr, int low, int high) {
    int pivot = arr[high];
    int i = low - 1;

    for (int j = low; j < high; j++) {
        if (arr[j] < pivot) {
            i++;
            std::swap(arr[i], arr[j]);
        }
    }

    std::swap(arr[i + 1], arr[high]);
    return i + 1;
}

void quickSort(std::vector<int>& arr, int low, int high) {
    if (low < high) {
        int pivotIndex = partition(arr, low, high);
        quickSort(arr, low, pivotIndex - 1);
        quickSort(arr, pivotIndex + 1, high);
    }
}

int main() {
    std::vector<int> arr = {38, 27, 43, 3, 9, 82, 10};
    int n = arr.size();

    quickSort(arr, 0, n - 1);

    std::cout << "Sorted array: ";
    for (int num : arr) {
        std::cout << num << " ";
    }
    return 0;
}

输出

Sorted array: 3 9 10 27 38 43 82 

结论

总之,在考虑了三种排序算法(冒泡排序、归并排序和快速排序)以按升序排列数组后,很明显每种方法都有优点和缺点。尽管构造简单,但由于最坏情况下的时间复杂度为 O(n2),冒泡排序对于较大的数组会失去有效性。归并排序适用于较大的数据集,并且由于其时间复杂度为 O(n log n),因此在所有情况下都能提供一致的性能。快速排序因其效率而有效,并且在大多数情况下表现良好。它的平均时间复杂度为 O(n log n)。要排序的数据的确切要求和质量决定了要使用的排序算法。


相关文章