c语言归并排序(详解)
2023-12-14 09:49:14
归并排序是一种分治算法,它将列表分割成较小的子列表,然后递归地对子列表进行排序,最后将这些子列表合并以产生已排序的列表。基本概念包括:
- 分割:将列表分割成较小的子列表,直到子列表的长度为1或0。
- 排序:递归地对子列表进行排序,直到所有子列表都已经有序。
- 合并:将已排序的子列表合并,通过比较两个子列表的元素,并按顺序放入一个新的列表中,直到所有子列表合并成一个已排序的列表。
设置单页面启动:
归并排序项目结构:
归并排序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);
}
归并排序运行结果:
文章来源:https://blog.csdn.net/qq_45973003/article/details/134911360
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!