归并排序 希尔排序

归并排序的关键代码主要包括两部分:拆分数组和合并数组。

  1. 拆分数组

将待排序数组不断拆分成小数组,直到小数组的长度为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。在每个增量值下,对于未排序的元素,在其前面已排序元素内找到合适的位置插入,并保持之前元素的相对位置关系不变。这个过程类似于插入排序,只是多了一个增量序列的设置。循环结束后,即可得到排好序的数组。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值