归并排序
来源:互联网 发布:linux shutdown命令 编辑:程序博客网 时间:2024/06/08 08:29
今天写个归并排序,
1.分:二分法,为了让每个组元素都有序,只有每组都只有一个元素时才有序
2.合:小组按照二分法分出的小组组合
45 5 4 12 4 156 456 465 4 12 16 6
45 5 4 12 4 156 456 465 4 12 16 6
45 5 4 12 4 156 456 465 4 12 16 6
45 5 4 12 4 156 456 465 4 12 16 6
合:
5 45 4 4 12 156 456 465 4 12 16 6
4 5 45 4 12 156 4 456 465 6 12 16
4 4 5 12 45 156 4 6 12 16 456 465
归并排序的所有 index 全是下标:startIndex = 0 , endIndex = 11 ,minIndex = (startIndex + endIndex)/2
arr startIndex minIndex
arr minIndex + 1 endIndex
startIndex < endIndex ,i = startIndex,j = (startIndex + endIndex)/2 + 1,
i <= minIndex ,i != midIndex ,
j <= minIndex + 1 , j != minIndex ,这些是分析过程
以下是程序:'
void Merge(int arr[],int tmp[],int startIndex,int minIndex,int endIndex)
{
int i = startIndex;
int j = mindIndex + 1;
int k = startIndex;
while(i != mindIndex + 1 && j != endIndex + 1)
{
if(arr[i] > arr[j])
{
tmp[k ++] = arr[j ++];
}
else
{
tmp[k ++] = arr[i ++];
}
}
while(i != minIndex + 1)
{
tmp[k ++] = arr[i ++];
}
while(j != endIndex + 1)
{
tmp[k ++] = arr[j ++];
}
for(int i = startIndex;i <= endIndex;++i)
{
arr[i] = tmp[i];
}
}
void MergeSort(int arr[],int tmp[],int stratIndex,int endIndex)
{
if(startIndex < endIndex)
{
int minIndex = (startIndex + endIndex)/2;
MergeSort(arr,tmp,startIndex,endIndex);
MergeSort(arr,tmp,minIndex + 1,endIndex);
Merge(arr,tmp,startIndex,minIndex,endIndex);
}
}