把数据分段,从某段中逐个选最小的元素移入新数据段,然后再 段与段 之间比较再形成新的数据段。下面是通过打印学习这样的数据是如何搬移的:个人觉得这个思想并行处理上比较方便(分治办法)。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <sys/time.h>
void ShowSortPro(int arr[], int len)
{
int i;
for (i=0; i<len; i++)
printf("%6d ", arr[i]);
printf(" \n");
}
static int selfmin(int x, int y)
{
return x < y ? x : y;
}
//
// 归并排序
// 输入参数:数组
// 数组的长度
//
void MergeSort(int arr[], int len) {
int* a = arr;
int* b = (int*) malloc(len * sizeof(int));
int seg, start;
for (seg = 1; seg < len; seg += seg) {
printf("============================================================================== seg%d\n", seg);
for (start = 0; start < len; start += seg + seg) {
printf("============================================================================ start%d\n", start);
int low = start, mid = selfmin(start + seg, len), high = selfmin(start + seg + seg, len);
int k = low;
int start1 = low, end1 = mid;
int start2 = mid, end2 = high;
while (start1 < end1 && start2 < end2){
printf("start1=%d, start2=%d end1=%d, end2=%d\n", start1, start2, end1, end2);
b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
ShowSortPro(b, len);
}
printf("---------------------------------------------------------------------------\n");
while (start1 < end1)
b[k++] = a[start1++];
while (start2 < end2)
b[k++] = a[start2++];
ShowSortPro(b, len);
}
int* temp = a;
a = b;
b = temp;
printf("============================================================================== seg%d\n", seg);
}
if (a != arr) {
int i;
for (i = 0; i < len; i++)
b[i] = a[i];
b = a;
}
free(b);
}
void main() {
int arr[] = { 65, 75, 59, 26, 92, 19, 8, 67, 86, 98, 87 };
int len;
// sizeof是运算符,不是函数
// sizeof能求得静态分配内存的数组的长度,即占用内存的大小,以byte为单位
len = (int) sizeof(arr) / sizeof(arr[0]);
ShowSortPro(arr, len);
printf("==================================================================================START\n");
MergeSort(arr, len);
printf("==================================================================================END\n");
ShowSortPro(arr, len);
}
测试编译器对代码进行自动优化编译和不优化的耗时比较。感兴趣的可以试试其他级别的优化,这里要注意优化后程序的结果要正确耗时比较才有意义。