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
(
n
2
)
O(n^2)
O ( n 2 )
O
(
n
2
)
O(n^2)
O ( n 2 )
O
(
n
2
)
O(n^2)
O ( n 2 )
O
(
n
3
2
)
O(n^\frac{3}{2})
O ( n 2 3 )
O
(
n
l
o
g
n
)
O(nlogn)
O ( n l o g n )
O
(
n
l
o
g
n
)
O(nlogn)
O ( n l o g n )