// ConsoleApplication3.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include<omp.h>
# include <stdio.h>
using namespace std;
int * Guibing(int n, int nlist[], int m, int mlist[]) {
int i = 0;
int j = 0, num = 0;
int *p = (int *)malloc((n + m)*sizeof(int)); //开辟的空间由输入的n决定;
while (1) {
if (nlist[i] >= mlist[j])
{
p[num] = mlist[j];
j = j + 1;
num++;
}
else {
p[num] = nlist[i];
i = i + 1;
num++;
}
if (i >= n) {
for (int z = j; z < m; z = z + 1)
{
p[num] = mlist[z];
num++;
}
break;
}
else if (j >= m) {
for (int z = i; z < n; z = z + 1)
{
p[num] = nlist[z];
num++;
}
break;
}
if (num == n + m)
break;
}
return p;
}
int* fourGuibing(int a[], int sum) {
int n = sum / 4, m = sum / 2;
int **list;
list = new int*[2]; //行 //申请行的空间
//每行的列申请空间
for (int i = 0; i<2; i++)
{
list[i] = new int[m];
}
int num = 0;
//该循环为了将数组分成四组,然后两两归并;
for (int i = 0; i < 2; i++) {
int *alist = (int *)malloc((n)*sizeof(int));
int *blist = (int *)malloc((n)*sizeof(int));
for (int j = 0; j < n; j++) {
alist[j] = a[num];
num++;
}
for (int j = 0; j < n; j++) {
blist[j] = a[num];
num++;
}
int *p = Guibing(n, alist, n, blist);
for (int j = 0; j < m; j++)
{
list[i][j] = p[j];
}
delete[] alist;
delete[] blist;
}
int *p = Guibing(m, list[0], m, list[1]);
//该循环为了将两两归并完的数组进行归并;
for (int i = 0; i<2; i++)
{
delete[] list[i];
}
delete[] list;
return p;
}
int main() {
int a[] = { 1,5,9,2,6,10,3,7,11,4,8,12 };//按照1,5,9;2,6,10;3,7,11;4,8,12;这四组进行排序
int *alist = (int *)malloc((12)*sizeof(int));
int sum = 12;//总的数组大小
alist = fourGuibing(a, sum);
for (int i = 0; i < 12; i++)
{
cout << alist[i] << " ";
}
}