归并排序
算法原理
归并排序是基于分治法的经典排序算法:
- 拆分:把数组从中间分成两半,递归拆分直到每个区间只有一个元素。
- 合并:将两个有序子区间合并成一个更大的有序区间。
- 最终整个数组变为有序。
一、适用场景
- 大数据量排序,性能稳定且始终为 O(n log n)
- 追求稳定排序的场景
- 外部排序(数据无法全部载入内存)
- 链表排序(最高效)
- 不适合内存极小的嵌入式场景(空间消耗 O(n))
二、复杂度分析
1.时间复杂度
- 最好时间复杂度:O(n log n)
- 平均时间复杂度:O(n log n)
- 最坏时间复杂度:O(n log n)
2.空间复杂度
空间复杂度:O(n)(需要临时数组)
三、代码实现
1、Python实现
python
# 归并排序 Python 实现
def merge(arr, left, mid, right):
temp = []
i = left
j = mid + 1
while i <= mid and j <= right:
if arr[i] <= arr[j]:
temp.append(arr[i])
i += 1
else:
temp.append(arr[j])
j += 1
temp += arr[i:mid+1]
temp += arr[j:right+1]
arr[left:right+1] = temp
def merge_sort(arr, left, right):
if left < right:
mid = (left + right) // 2
merge_sort(arr, left, mid)
merge_sort(arr, mid + 1, right)
merge(arr, left, mid, right)
return arr
2、Java实现
java
// 归并排序 Java 实现
public static void merge(int[] arr, int left, int mid, int right) {
int[] temp = new int[right - left + 1];
int i = left, j = mid + 1, k = 0;
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 (i = left, k = 0; i <= right; i++, k++) arr[i] = temp[k];
}
public static void mergeSort(int[] arr, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
3、C语言实现
c
// 归并排序 C 语言实现
void merge(int arr[], int left, int mid, int right) {
int i = left, j = mid + 1, k = 0;
int temp[right - left + 1];
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 (i = left, k = 0; i <= right; i++, k++) arr[i] = temp[k];
}
void mergeSort(int arr[], int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
总结
记录自己的快乐学习日志,也祝贺观看到这的小伙伴早日学有所成,财富自由💰💰。
记得点赞👍、收藏👋呀!!!