归并排序的思想
步骤一:首先将待排序的元素分成大小大致相同的两个序列。
步骤二:再把子序列分成大小大致相同的两个子序列。
步骤三:如此下去,直到分解成一个元素停止,这时含有一个元素的子序列都是有序的。
步骤四:进行合并操作,将两个有序的子序列合并为一个有序序列,如此下去,直到所有的元素都合并为一个有序序列。
归并排序的递归代码实现
void PrintInt(int* ar, int n)
{
for (int i = 0; i < n; i++)
{
printf("%5d", ar[i]);
}
printf("\n");
}
void Merge(int* dest, int* src, int left, int mid, int right) //合并
{
int i = left, j = mid + 1;
int k = left;
while (i <= mid && j <= right)
{
dest[k++] = src[i] < src[j] ? src[i++] : src[j++];
}
while (i <= mid)
{
dest[k++] = src[i++];
}
while (j <= right)
{
dest[k++] = src[j++];
}
}
void Copy(int* dest, int* src, int left, int right)
{
for (int i = left; i <= right; i++)
{
dest[i] = src[i];
}
}
void MergePass(int*temp,int*nums,int left, int right)
{
if (left < right)
{
int mid = (right - left) / 2 + left;
MergePass(temp,nums, left, mid);//先拆分
MergePass(temp,nums, mid + 1, right);
Merge(temp,nums, left, mid, right);//合并
Copy(nums, temp, left, right);
}
}
void MergeSort(int* nums, int n)
{
if (nullptr == nums || n < 2)return;
int* temp = new int[n]; //创建一个新的数组
MergePass(temp,nums, 0, n - 1);
delete[]temp;
}
int main()
{
int ar[] = { 56,23,78,45,99,85,12,34,67,100 };
int n = sizeof(ar) / sizeof(ar[0]);
MergeSort(ar, n);
PrintInt(ar, n);
}
归并排序的非递归代码实现
//非递归排序
void PrintInt(int* ar, int n)
{
for (int i = 0; i < n; i++)
{
printf("%5d", ar[i]);
}
printf("\n");
}
void Merge(int* dest, int* src, int left, int mid, int right)
{
int i = left, j = mid + 1;
int k = left;
while (i <= mid && j <= right)
{
dest[k++] = src[i] < src[j] ? src[i++] : src[j++];
}
while (i <= mid)
{
dest[k++] = src[i++];
}
while (j <= right)
{
dest[k++] = src[j++];
}
}
void MergePass(int* dest, int* src, int n, int s)
{
int i = 0;
printf("%d\n", s);
while (i + 2 * s - 1 <= n-1)
{
Merge(dest, src, i, i + s - 1, i + 2 * s - 1);
printf("left:%d mid:%d right:%d\n", i, i + s - 1, i + 2 * s - 1);
i = i + 2 * s;
}
if (s+i<n) //n-1>=s+i
{
Merge(dest, src, i, i + s - 1, n - 1);
printf("left:%d mid:%d right:%d\n", i, i + s - 1, n-1);
}
else
{
for (int j = i; j < n; j++)
{
dest[j] = src[j];
}
}
}
//以2的次幂方式进行合并
void MergeSort(int* nums, int n)
{
int* temp = new int[n];
int s = 1;
while (s < n)
{
MergePass(temp, nums, n, s);
s += s;
MergePass(nums, temp, n, s);
s + s;
}
delete[]temp;
}
int main()
{
int ar[] = { 56,23,78,45,99,85,12,34,67,100 };
int n = sizeof(ar) / sizeof(ar[0]);
MergeSort(ar, n);
PrintInt(ar, n);
}