归并排序
排序思想:(分治思想)先将整个集合进行递归拆分,拆到一个数据的时候开始返回,然后进行合并返回;
时间复杂度: o(n * (log n / log 2) )
稳定性: 稳定
//归并排序接口函数
void merge_sort(int *array, int length)
{
int *temp = NULL;
if(array == NULL || length < 2){
return ;
}
temp = (int *)Malloc(sizeof(int) * length);
Merge_sort(array, 0, length - 1, temp);
free(temp);
}
//归并排序 分开函数
static void Merge_sort(int *array,int left,int right,int *temp)
{
int mid = -1;
if(left < right){
mid = left + ((right - left) >> 1); //避免内存泄露
//拆分阶段
Merge_sort(array, left, mid, temp);
Merge_sort(array, mid + 1, right, temp);
//合并两个有序序列
merge_array(array, left, mid, right, temp);
}
}
//归并排序 合并函数
static void merge_array(int *array, int left,int mid, int right, int *temp)
{
int i = left; //i和j为两个序列的起点
int j = mid + 1;
int m = mid; //mid和right为两个序列的终点
int n = right;
int k = 0; //temp存放结果的下标
while(i <= m && j <= n){ //array1和array2的元素进行比较
if(array[i] <= array[j]){
temp[k++] = array[i++];
}else{
temp[k++] = array[j++];
}
}
while(i <= m){
temp[k++] = array[i++];
}
while(j <= n){
temp[k++] = array[j++];
}
//把temp的内容复制到array的指定位置
memcpy(array + left, temp, sizeof(int) * k);
}
/* 数据示例如下:
第一步:先拆分
14 3 57 2 45 33 30 2
14 3 57 2 45 33 30 2
14 3 57 2 45 33 30 2
14 3 57 2 45 33 30 2 单独成为一个序列
第二步:再合并
3 14 2 57 33 45 2 30
2 3 14 57 2 30 33 45
2 2 3 14 30 33 45 57
*/