归并排序
思想:分治策略
分: 数据划分成一个个的小组
组内有序
合: 小组进行归并
归并后的小组,组内有序
代码实现
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void ShowArr(int arr[],int len)
{
int i = 0;
for( ; i < len; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void Merge(int arr[],int tmp[],int start,int mid,int end)
{
int i = start;//i 标识左小组的第一个位置
int j = mid + 1;//j 标识右小组的第一个位置
int k = start;//标识tmp中当前小组数据排序存放的起始的位置
while(i < mid + 1 && j < end + 1)//退出意味着越界
{
if(arr[i] <= arr[j])
{
tmp[k++] = arr[i++];
}
else
{
tmp[k++] = arr[j++];
}
}
while(j < end + 1)//右边小组没有越界
{
tmp[k++] = arr[j++];
}
while(i < mid + 1)//左边小组没有越界
{
tmp[k++] = arr[i++];
}
for(i = start; i <= end; i++)
{
arr[i] = tmp[i];
}
}
void MergeS(int arr[],int tmp[],int startindex,int endindex)//划分为小组
{
if(startindex < endindex)
{
int midindex = (startindex + endindex) / 2;
MergeS(arr,tmp,startindex,midindex);
MergeS(arr,tmp,midindex,endindex);
Merge(arr,tmp,startindex,midindex,endindex);
}
}
void MergeSort(int arr[],int len)
{
int * tmp = (int*)malloc(sizeof(int)*len);
MergeS(arr,tmp,0,len-1);
free(tmp);
}
int main()
{
int arr[] = {15,3,2,43,46,75,12,4,235,45,7};
int len = sizeof(arr) / sizeof(arr[0]);
ShowArr(arr,len);
MergeSort(arr,len);
ShowArr(arr,len);
return 0;
}