C 排序算法:归并排序
一、实现
#include<stdio.h>
void mergrArr(int *arr,int *tmp,int start,int mid,int end);
void mergeSort(int *arr, int *tmp, int start,int end);
void disArr(int *p,int size);
int main()
{
int arr[] = { 1,9,8,7,0,2 };
int tmp[sizeof(arr) / sizeof(*arr)] = {0};
mergeSort(arr,tmp,0, sizeof(arr) / sizeof(*arr)-1);
disArr(arr,sizeof(arr)/sizeof(*arr));
return 0;
}
void mergrArr(int *arr, int *tmp, int start, int mid, int end)
{
int i = start, j = mid+1, k = start;
while (i != mid+1&&j != end+1)
{
if (arr[i] < arr[j])
tmp[k++] = arr[i++];
else
tmp[k++] = arr[j++];
}
if (i == mid+1)
while (j != end+1) tmp[k++] = arr[j++];
else
while (i != mid+1) tmp[k++] = arr[i++];
while (start <= end)
{
arr[start] = tmp[start];
start++;
}
}
void mergeSort(int *arr, int *tmp, int start, int end)
{
if (start < end)
{
int mid = (start + end) / 2;
mergeSort(arr,tmp,start,mid);
mergeSort(arr, tmp,mid+1,end);
mergrArr(arr,tmp,start,mid,end);
}
}
void disArr(int *p,int size)
{
for (int i = 0; i < size; ++i)
{
printf("%-3d", p[i]);
}
puts("");
}

二、过程演示

三、算法比较
算法 | 选择 | 冒泡 | 插入 | 希尔 | 快速 | 归并 |
---|
平均时间复杂度 | O(n2)O(n^2)O(n2) | O(n2)O(n^2)O(n2) | O(n2)O(n^2)O(n2) | O(n32)O(n^\frac{3}{2})O(n23) | O(nlogn)O(nlogn)O(nlogn) | O(nlogn)O(nlogn)O(nlogn) |