归并排序

来源:互联网 发布: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);

}

}






原创粉丝点击