归并排序的关键代码主要包括两部分:拆分数组和合并数组。
- 拆分数组
将待排序数组不断拆分成小数组,直到小数组的长度为1,实现代码如下:
void merge_sort(int arr[], int left, int right)
{
if (left < right) {
int mid = (left + right) / 2;
// 递归拆分左边数组
merge_sort(arr, left, mid);
// 递归拆分右边数组
merge_sort(arr, mid+1, right);
// 合并左右数组
merge(arr, left, mid, right);
}
}
2.合并数组
在合并两个子数组时,需要从两个子数组中依次取出最小的元素进行比较,将较小的元素按照顺序存放到一个新的辅助数组中。实现代码如下:
void merge(int arr[], int left, int mid, int right)
{
int i = left, j = mid + 1, k = 0;
// 创建临时数组
int *temp_arr = new int[right-left+1];
// 将两个子数组中的元素按照大小顺序复制到临时数组中
while(i <= mid && j <= right){
if (arr[i] <= arr[j]) {
temp_arr[k++] = arr[i++];
} else {
temp_arr[k++] = arr[j++];
}
}
// 将剩余的元素直接复制到临时数组中
while (i<=mid) temp_arr[k++] = arr[i++];
while (j<=right) temp_arr[k++] = arr[j++];
// 用临时数组中的元素替换原数组中的元素
for (i = left, k=0; i <= right; ++i,++k) {
arr[i] = temp_arr[k];
}
// 删除临时数组,避免内存泄漏
delete[] temp_arr;
}
希尔排序:
void shell_sort(int arr[], int n) {
int gap, i, j, temp;
for (gap = n / 2; gap > 0; gap /= 2) {
for (i = gap; i < n; i++) {
temp = arr[i];
for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
arr[j] = arr[j - gap];
}
arr[j] = temp;
}
}
}
shell_sort
函数接受一个整数数组 arr
和数组长度 n
作为参数,对数组进行希尔排序。在排序过程中,首先定义一个增量 gap
,初始值为数组长度的一半,每次循环将 gap
缩小一半直到为 1。在每个增量值下,对于未排序的元素,在其前面已排序元素内找到合适的位置插入,并保持之前元素的相对位置关系不变。这个过程类似于插入排序,只是多了一个增量序列的设置。循环结束后,即可得到排好序的数组。