#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++;
}
}
}
C语言-归并排序法
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 选择排序 对于任何输入,时间为O(n*n); 冒泡排序 最优(对于升序的数组,因为加入了一个跳出判断):O(n),...