#include<iostream>
#include<stack>
using namespace std;
//选择排序
void SelectSort(int *array, int size)
{
for (int idx = 0; idx < size; ++idx)
{
int min = idx ;//假定第一个元素最小
int tmp = idx + 1;//标记第二个元素
while (tmp < size)//寻找最小的元素
{
if (array[tmp] < array[min])
{
min = tmp;
}
tmp++;
}
if (idx != min)
{
std::swap(array[min], array[idx]);
}
}
}
//冒泡排序
void BubbleSort(int* array, int size)
{
int flag = 1;
int count = 0;
for (int idx = 0; idx < size - 1; ++idx)//控制数据向后遍历
{
for (int jx = 0; jx < size - idx - 1; ++jx)//两个数进行比较
{
if (array[jx]>array[jx + 1])
{
std::swap(array[jx], array[jx + 1]);
flag = 0;
}
count++;//标记比较次数
}
if (flag == 1)//有序的不进行比较
{
break;
}
}
}
//递归归并排序
void Merge(int *array, int *temp,int left, int mid, int right)//归并
{
int begin1 = left;//标记最左边的节点
int end1 = mid;//标记中间的节点
int begin2 = mid+1;//
int end2 = right;
int index = left;
while (begin1 <= end1 && begin2 <= end2)
{
if (array[begin1] < array[begin2])
{
temp[index++] = array[begin1++];
}
else
{
temp[index++] = array[begin2++];
}
}
while (begin1 <= end1)
{
temp[index++] = array[begin1++];
}
while (begin2 <= end2)
{
temp[index++] = array[begin2++];
}
}
void _MergeSort(int *array,int *temp, int left, int right)
{
if (left < right)
{
int mid = left + ((right - left) >> 1);
_MergeSort(array, temp, left, mid);
_MergeSort(array,temp, mid + 1, right);
Merge(array, temp,left, mid, right);
memcpy(array + left, temp + left, sizeof(array[0])*(right - left + 1));
}
}
void MergeSort(int *array, int size)
{
int *temp = new int [size];
if (NULL != temp)
{
_MergeSort(array, temp, 0, size - 1);
delete[]temp;
}
}
//非递归归并排序
void MergeSortNor(int *array, int size)
{
int* temp = new int[size];
int left = 0;
int right = size - 1;
int gap = 1;
while (gap < size)
{
for (size_t idx = 0; idx < size; idx += 2 * gap)
{
left = idx;
int mid = idx + gap - 1;
right = mid + gap;
if (mid >= size)
{
mid = size - 1;
}
if (right >= size)
{
right = size - 1;
}
Merge(array, temp, left, mid, right);//归并
}
memcpy(array, temp, size*sizeof(int));
gap++;
}
delete[]temp;
}
//打印排序后的序列
void printfSort(int arr[], int count)
{
for (int idx = 0; idx < count; ++idx)
{
cout << arr[idx] << " ";
}
cout << endl;
}
void FuntTest()
{
//int array[] = { 1 };
int array[] = { 21, 25, 49, 25, 0, 16 };
//int array[] = { 7, 3, 2, 0, 1, 4 };
//int array[] = { 2, 3, 5, 7, 9, 0, 1, 6, 4, 8 };
int count = sizeof(array) / sizeof(array[0]);
cout << count << endl;
printfSort(array, count);
//BubbleSort(array, count);//ok
//SelectSort(array, count);//ok
//InsertSort(array, count);
//MergeSort(array, count);//递归归并排序
//MergeSortNor(array, count);非递归归并排序
printfSort(array,count);
}
int main()
{
FuntTest();
system("pause");
return 0;
}
归并排序的具体实现思路