归并排序及测试算法速度

归并排序:

  • 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

实现步骤:

  1. 分:使用递归,实现分隔成单独的数据

  2. 治:
    1)将数组中的元素按照从大到小的顺序排入到temp临时数组中,直到一侧完全排入
    2)将剩下一侧依次排入temp中
    3)将排好序的temp(临时数组)拷贝到arr数组中

  3. 图示:

在这里插入图片描述

在这里插入图片描述

代码实现:

package com.sai.sort;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

/**
 * @Author sai
 * @Description 归并排序(分治)
 * @Time 2020-07-20 15:24
 */
public class Merget {
    public static void main(String[] args) {
        int arr[] = {8,4,5,7,1,3,6,2};
        int[] temp = new int[arr.length];
        merget(arr,0,arr.length-1,temp);
        System.out.println(Arrays.toString(arr));

        /*
        //测试算法速度
        int[] arr1 = new int[80000];
        for (int i=0;i<80000;i++){
            arr1[i] = (int)(Math.random()*80000);
        }

        Date date1 = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String s1 = simpleDateFormat.format(date1);
        System.out.println("排序前:"+s1);

        int[] temp = new int[arr1.length];
        merget(arr1,0,arr1.length-1,temp);

        Date date2 = new Date();
        String s2 = simpleDateFormat.format(date2);
        System.out.println("排序后:"+s2);

         */
    }

    /**
     * @Author 分+和
     * @param arr  带排序的数组
     * @param left  最左边的索引
     * @param right  最右边的索引
     * @param temp  用来拷贝的临时数组
     */
    public static void merget(int[] arr,int left,int right,int[] temp){
        if(left<right){
            //中间索引
            int mid = (left+right)/2;

            //向左拆分
            merget(arr, left, mid, temp);
            //向右拆分
            merget(arr, mid+1, right, temp);
            //合并
            mergetSort(arr,left,right,mid,temp);
        }
    }

    /**
     * @Author 合并的方法
     * @param arr  要合并的数组
     * @param left  最左边的索引
     * @param right  最右边的索引
     * @param mid  中间值
     * @param temp  用来拷贝的临时数组
     */
    public static void mergetSort(int[] arr,int left,int right,int mid,int[] temp){

        int i = left;
        int j = mid + 1;
        int t = 0;

        //1.将数组中的元素按照从大到小的顺序排入到temp临时数组中,直到一侧完全排入
        while (i<=mid  &&  j<=right){
            if(arr[i] <= arr[j]){
                temp[t] = arr[i];
                t++;
                i++;
            }else {
                temp[t] = arr[j];
                t++;
                j++;
            }
        }

        //2.将剩下一侧依次排入temp中
        while (i<=mid){
            temp[t] = arr[i];
            t++;
            i++;
        }
        while (j<=right){
            temp[t] = arr[j];
            t++;
            j++;
        }

        //3.将排好序的temp(临时数组)拷贝到arr数组中
        t = 0;
        int tempLeft = left;
        while (tempLeft <= right){
            arr[tempLeft] = temp[t];
            t++;
            tempLeft++;
        }

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C++实现的归并排序算法的示例代码: ```cpp #include <iostream> using namespace std; // 合并两个子数组 void merge(int arr[], int left[], int right[], int leftSize, int rightSize) { int i = 0, j = 0, k = 0; // 比较两个子数组的元素,并将较小的元素放入原始数组中 while (i < leftSize && j < rightSize) { if (left[i] <= right[j]) { arr[k++] = left[i++]; } else { arr[k++] = right[j++]; } } // 将剩余的元素放入原始数组中 while (i < leftSize) { arr[k++] = left[i++]; } while (j < rightSize) { arr[k++] = right[j++]; } } // 归并排序函数 void mergeSort(int arr[], int size) { if (size <= 1) { return; } int mid = size / 2; int* left = new int[mid]; int* right = new int[size - mid]; // 分割数组 for (int i = 0; i < mid; i++) { left[i] = arr[i]; } for (int i = mid; i < size; i++) { right[i - mid] = arr[i]; } // 递归调用归并排序 mergeSort(left, mid); mergeSort(right, size - mid); // 合并两个子数组 merge(arr, left, right, mid, size - mid); // 释放内存 delete[] left; delete[] right; } // 测试代码 int main() { int arr[] = {5, 2, 8, 3, 1, 9, 4, 6, 7}; int size = sizeof(arr) / sizeof(arr[0]); cout << "原始数组:"; for (int i = 0; i < size; i++) { cout << arr[i] << " "; } cout << endl; mergeSort(arr, size); cout << "排序后:"; for (int i = 0; i < size; i++) { cout << arr[i] << " "; } cout << endl; return 0; } ``` 这段代码定义了一个merge函数用于合并两个子数组,以及一个mergeSort函数用于进行归并排序。在main函数中,我们可以调用mergeSort函数对待排序的数组进行排序,并输出排序后的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值