c++数组在排序算法中的应用

c++数组在排序算法中的应用

在排序算法中,C++数组是一个非常常用的数据结构。以下是一些常见的排序算法及其对C++数组的应用:

  1. 冒泡排序(Bubble Sort):它是一种简单的排序算法,通过重复遍历要排序的数组,比较相邻的两个元素,如果它们的顺序不正确,则交换它们的位置。

  2. 插入排序(Insertion Sort):它将数组分为已排序区域和未排序区域,每次将未排序区域的第一个元素插入到已排序区域中的正确位置。

  3. 选择排序(Selection Sort):它每次从未排序区域中选择最小的元素,并将其放到已排序区域的末尾。

  4. 快速排序(Quick Sort):它使用分治的策略,通过将数组分成两个子数组来递归地排序。

  5. 归并排序(Merge Sort):它也使用分治的策略,将数组递归地分成两个子数组,排序后将它们合并起来。

对于以上的每种排序算法,C++数组都是其重要的应用之一。排序算法都需要对数组中的元素进行比较和移动,C++数组提供了一种方便的方式来存储和操作这些元素。此外,使用C++数组还可以方便地通过下标访问数组中的元素,从而实现快速的读写操作。

以下是对五种排序算法的C++代码实现以及注释:

  1. 冒泡排序(Bubble Sort):
void bubbleSort(int arr[], int n) {
    
    
    for (int i = 0; i < n - 1; i++) {
    
     // 遍历n-1轮
        for (int j = 0; j < n - i - 1; j++) {
    
     // 每轮遍历n-i-1个元素
            if (arr[j] > arr[j + 1]) {
    
     // 如果相邻两个元素顺序不对
                swap(arr[j], arr[j + 1]); // 交换它们的位置
            }
        }
    }
}
  1. 插入排序(Insertion Sort):
void insertionSort(int arr[], int n) {
    
    
    for (int i = 1; i < n; i++) {
    
    
        int key = arr[i]; // 记录当前待插入的元素
        int j = i - 1; // j表示已排序区间的末尾
        while (j >= 0 && arr[j] > key) {
    
     // 查找插入位置
            arr[j + 1] = arr[j]; // 如果当前元素比待插入元素大,将它后移一位
            j--;
        }
        arr[j + 1] = key; // 将待插入元素插入到正确的位置
    }
}
  1. 选择排序(Selection Sort):
void selectionSort(int arr[], int n) {
    
    
    for (int i = 0; i < n - 1; i++) {
    
     // 遍历n-1轮
        int minIndex = i; // 记录最小值的下标
        for (int j = i + 1; j < n; j++) {
    
     // 在未排序区间中查找最小值
            if (arr[j] < arr[minIndex]) {
    
    
                minIndex = j; // 更新最小值的下标
            }
        }
        swap(arr[i], arr[minIndex]); // 将最小值与当前位置交换
    }
}
  1. 快速排序(Quick Sort):
void quickSort(int arr[], int left, int right) {
    
    
    if (left >= right) return; // 如果只有一个元素或者左指针已经大于等于右指针,直接返回
    int i = left, j = right, pivot = arr[(left + right) / 2]; // 选择基准元素
    while (i <= j) {
    
    
        while (arr[i] < pivot) i++; // 在左半部分查找大于等于基准元素的元素
        while (arr[j] > pivot) j--; // 在右半部分查找小于等于基准元素的元素
        if (i <= j) {
    
     // 如果找到了两个需要交换的元素
            swap(arr[i], arr[j]); // 交换它们的位置
            i++;
            j--;
        }
    }
    quickSort(arr, left, j); // 对左半部分递归排序
    quickSort(arr, i, right); // 对右半部分
  1. 归并排序(Merge Sort):
void merge(int arr[], int left, int mid, int right) {
    
    
    int len = right - left + 1; // 计算需要合并的元素个数
    int* temp = new int[len]; // 申请一个临时数组存储合并结果
    int i = left, j = mid + 1, k = 0; // i、j分别表示左右两个子数组的起始位置,k表示temp数组的下标
    while (i <= mid && j <= right) {
    
     // 依次将左右两个子数组中较小的元素存入temp数组中
        if (arr[i] <= arr[j]) {
    
    
            temp[k++] = arr[i++];
        } else {
    
    
            temp[k++] = arr[j++];
        }
    }
    while (i <= mid) temp[k++] = arr[i++]; // 如果左子数组还有剩余元素,将它们全部存入temp数组中
    while (j <= right) temp[k++] = arr[j++]; // 如果右子数组还有剩余元素,将它们全部存入temp数组中
    for (int p = 0; p < len; p++) {
    
     // 将temp数组中的元素复制回原数组中
        arr[left + p] = temp[p];
    }
    delete[] temp; // 释放临时数组的空间
}

void mergeSort(int arr[], int left, int right) {
    
    
    if (left >= right) return; // 如果只有一个元素或者左指针已经大于等于右指针,直接返回
    int mid = (left + right) / 2; // 将数组一分为二
    mergeSort(arr, left, mid); // 递归地对左半部分进行排序
    mergeSort(arr, mid + 1, right); // 递归地对右半部分进行排序
    merge(arr, left, mid, right); // 合并左右两个有序子数组
}

以上就是对冒泡排序、插入排序、选择排序、快速排序和归并排序的C++代码实现以及注释。

接下来讲一下他们的底层原理:
冒泡排序、插入排序、选择排序、快速排序和归并排序都是基于比较的排序算法,它们的底层原理都是通过比较数组中元素的大小来确定它们的相对位置,进而实现排序的目的。

冒泡排序的底层原理是通过相邻元素之间的比较和交换来将较大的元素逐步“冒泡”到数组的末尾,因此被称为冒泡排序。它的时间复杂度为O(n^2),不适用于大规模数据的排序。

插入排序的底层原理是将一个元素插入到已排好序的子序列中的合适位置,不断重复这个过程,最终得到一个有序序列。它的时间复杂度也是O(n^2),但是在处理部分有序的数据时表现较好。

选择排序的底层原理是每次从待排序的元素中选择最小的一个元素,放到已排序序列的末尾,重复这个过程,直到所有元素都排好序。它的时间复杂度也是O(n^2),但是在处理数据量较小的情况下,由于不需要频繁的交换元素,因此比冒泡排序和插入排序要快一些。

快速排序的底层原理是选取一个基准元素,将数组分成两个子数组,一部分比基准元素小,一部分比基准元素大,递归地对子数组进行排序,最终得到一个有序序列。它的时间复杂度为O(nlogn),是所有基于比较的排序算法中平均时间复杂度最小的一种,因此也是最常用的排序算法之一。

归并排序的底层原理是将待排序的数组分成两个子数组,对每个子数组进行递归排序,最后将两个有序的子数组合并成一个有序数组。它的时间复杂度也是O(nlogn),相对于快速排序,归并排序在处理链表等不支持随机访问的数据结构时更加方便,而且由于它是一种稳定的排序算法,因此也有一定的应用价值。

猜你喜欢

转载自blog.csdn.net/clayhell/article/details/130559198