歸并排序是一種分治算法,它將列表分割成較小的子列表,然后遞歸地對子列表進行排序,最后將這些子列表合并以產生已排序的列表。基本概念包括:
- 分割:將列表分割成較小的子列表,直到子列表的長度為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);
}
歸并排序運行結果: