归并排序c++代码是如何实现的?
admin
21
2024-07-21
归并排序的原理和步骤归并排序是一种经典的排序算法,它的运行时间为O(nlogn),其中n为待排序序列的长度。其核心思想是将待排序序列分成两个子序列,分别进行排序,然后将两个排好序的子序列合并成一个有序序列。归并排序的实现包括以下几个步骤:将待
归并排序的原理和步骤
归并排序是一种经典的排序算法,它的运行时间为O(nlogn),其中n为待排序序列的长度。其核心思想是将待排序序列分成两个子序列,分别进行排序,然后将两个排好序的子序列合并成一个有序序列。
归并排序的实现包括以下几个步骤:
- 将待排序序列不断二分,直到每个子序列只有一个元素。
- 将相邻的两个子序列合并为一个有序序列。
- 重复步骤2,直到所有子序列合并成一个有序序列。
C++代码实现
下面是使用C++语言实现归并排序的代码:
```cpp // 归并排序 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); // 合并 int i = left; // 左子序列起始位置 int j = mid + 1; // 右子序列起始位置 int k = 0; // 辅助数组的索引 int len = right - left + 1; int* temp = new int[len]; // 辅助数组 while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } // 处理剩余的元素 while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } // 将排好序的部分复制回原数组 for (int m = 0; m < len; m++) { arr[left + m] = temp[m]; } delete[] temp; } ```在以上代码中,`mergeSort`函数用于递归地进行排序。首先判断序列是否可以继续划分,如果不能划分则返回;如果可以划分,则将序列二分为两个子序列,分别进行排序。然后利用辅助数组将排好序的子序列合并。
最后,我们需要调用`mergeSort`函数对整个序列进行排序。
```cpp int main() { int arr[] = {5, 2, 9, 1, 7, 6, 3}; int len = sizeof(arr) / sizeof(arr[0]); mergeSort(arr, 0, len - 1); cout << "排序结果:"; for (int i = 0; i < len; i++) { cout << arr[i] << " "; } cout << endl; return 0; } ```以上代码实现了对一个整型数组的归并排序,并输出排序结果。
归并排序的优缺点
归并排序的优点有:
归并排序的缺点有:
- 需要额外的空间:归并排序需要额外的辅助数组来存储排好序的元素,因此对内存的消耗较大。
- 运行时间较长:归并排序的运行时间虽然是O(nlogn),但是由于要进行递归和合并操作,因此比其他排序算法(如快速排序)略慢。
尽管归并排序有一些缺点,但是由于其稳定性和适应大规模数据的特性,依然被广泛应用于实际开发中。