#include <stdio.h>
#include <stdlib.h>
void splitArrays();
void sortArrays(int num[], int start, int mid, int end);
int main(int argc, const char * argv[])
{
int num_really[11];
for (int i = 0; i < 11; i++) {
num_really[i] = arc4random() % (90 - 10 + 1) + 10;
}
for (int i = 0; i < 11; i++) {
printf("%d ", num_really[i]);
}
printf("\n");
splitArrays(num_really, 0, 10);
for (int i = 0; i < 11; i++) {
printf("%d ", num_really[i]);
}
printf("\n");
return 0;
}
void splitArrays(int num[], int start, int end) {
int mid = (start + end) / 2;
if (mid != start) {
splitArrays(num, start, mid);
splitArrays(num, mid + 1, end);
sortArrays(num, start, mid, end);
} else {
sortArrays(num, start, mid, end);
}
}
void sortArrays(int num[], int start, int mid, int end) {
int num_left[mid - start + 1];
int num_right[end - mid];
//复制左子列
for (int i = 0; i < mid - start + 1; i++) {
num_left[i] = num[start + i];
}
//复制右子列
for (int i = 0; i < end - mid; i++) {
num_right[i] = num[mid + 1 + i];
}
int l_start = 0;
int l_end = mid - start + 1;
int r_start = 0;
int r_end = end - mid;
int sign = start;
while (l_start < l_end && r_start < r_end) {
if (num_right[r_start] < num_left[l_start]) {
num[sign] = num_right[r_start];
r_start++;
} else {
num[sign] = num_left[l_start];
l_start++;
}
sign++;
}
//对于子列最后几个的处理
if (l_start == l_end) {
for (r_start; r_start < r_end; r_start++) {
num[sign] = num_right[r_start];
sign++;
}
} else if (r_start == r_end) {
for (l_start; l_start < l_end; l_start++) {
num[sign] = num_left[l_start];
sign++;
}
}
}
网友评论