当前位置:   article > 正文

c语言归并排序(详解)_cpp归并排序完整代码

cpp归并排序完整代码

归并排序是一种分治算法,它将列表分割成较小的子列表,然后递归地对子列表进行排序,最后将这些子列表合并以产生已排序的列表。基本概念包括:

  1. 分割:将列表分割成较小的子列表,直到子列表的长度为1或0。
  2. 排序:递归地对子列表进行排序,直到所有子列表都已经有序。
  3. 合并:将已排序的子列表合并,通过比较两个子列表的元素,并按顺序放入一个新的列表中,直到所有子列表合并成一个已排序的列表。

设置单页面启动:
在这里插入图片描述归并排序项目结构:

在这里插入图片描述
归并排序cpp代码截图:
在这里插入图片描述归并排序cpp代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include <time.h>
#include <sys/timeb.h>

#define MAX 10
using namespace std;


int* CreateArray() {
    // 开辟内存空间
    srand((unsigned int)time(NULL));
    int* arr = (int*)malloc(sizeof(int) * MAX);
    for (int i = 0; i < MAX; i++) {
        arr[i] = rand() % MAX;
    }
    return arr;
}
// 打印函数
void PrintArray(int arr[], int length) {
    for (int i = 0; i < length; i++) {
        cout << arr[i] << " ";

    }
    cout << endl;

}
// 合并算法
void Merge(int arr[], int start, int end,int mid, int* temp) {
    int i_start = start;
    int i_end = mid;
    int j_start = mid + 1;
    int j_end = end;
    // 表示辅助空间有多少个元素
    int length = 0; 
    // 合并两个有序序列
    while (i_start <= i_end && j_start <= j_end) {
        if (arr[i_start] < arr[j_start]) {
            temp[length] = arr[i_start];
            length++;
            i_start++;
        }
        else {
            temp[length] = arr[j_start];
            j_start++;
            length++; 
        }
    }
    // 遍历i这个序列
    while (i_start <= i_end) {
        temp[length] = arr[i_start];
        i_start++;
        length++;
    }
    // 遍历j序列
    while (j_start <= j_end) {
        temp[length] = arr[j_start];
        length++;
        j_start++;
    }
    // 将辅助空间中的数据覆盖到原来的空间
    for (int i = 0; i < length; i++) {
        arr[start + i] = temp[i];
    }
}

// 排序函数:归并排序
void MergeSort(int arr[],int start,int end,int* temp) {
    if (start >= end) {
        return;
    

    }
    
    int mid = (start + end) / 2;
    // 分组:左半边
    MergeSort(arr,start,mid,temp);
    // 分组:右半边
    MergeSort(arr, mid + 1, end, temp);
    // 合并
    Merge(arr,start,end,mid,temp);



}

int main()
{
    // 创建一个数组
    int* myArr = CreateArray();
    PrintArray(myArr, MAX);
    // 辅助空间
    int* temp = (int*)malloc(sizeof(int) * MAX);
    MergeSort(myArr, 0, MAX - 1,temp);
    PrintArray(myArr, MAX);
    // 释放空间
    free(temp);
    free(myArr);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103

归并排序运行结果:
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/658296
推荐阅读
相关标签
  

闽ICP备14008679号