原理:
以顺序排序为例
归并排序:把长度为n的数组细分成n个数组段,然后按数组排列顺序对这n个数组进行合并排序,在n/2次操作后得到n个由2个数值组成组成的数组段,再对其进行合并排序,依次操作,直到被合并成1条长为n的线段就排序完毕了。
代码如下:
//归并排序
#include "stdafx.h"
#include <iostream>
#include <algorithm>
using namespace std;
//合并2个排序完毕的数组
bool ComBine(int src[], int Start, int Mid, int End)
{
int tmp1 = Mid - Start + 1; //第一段数组长度
int tmp2 = End - Mid; //第二段数组长度
int *left = new int[tmp1]; //申请个临时数组保存第一段
int *right = new int[tmp2]; //申请个临时数组保存第二段
int cul = Start; //记录起始位置
//初始化第一段和第二段的数组
for(int i = 0; i < tmp1; ++i)
{
left[i] = src[i + Start];
}
for(int i = 0; i < tmp2; ++i)
{
right[i] = src[i + Mid + 1];
}
int i = 0;
int j = 0;
//遍历2个数组
while(i < tmp1 && j < tmp2)
{
//把小的赋值给原数组 用于输出
if(left[i] < right[j])
{
src[cul++] = left[i++];
}
else
{
src[cul++] = right[j++];
}
}
//如果哪个没遍历完 继续遍历
while(i < tmp1)
{
src[cul++] = left[i++];
}
while(j < tmp2)
{
src[cul++] = right[j++];
}
delete left;
delete right;
return true;
}
bool Sort(int src[], int Start, int End)
{
//排序
int mid;
//开始别结束大就跳出
if(Start < End)
{
mid = (Start + End)/2; //求中点
//递归 把每段数组都分成2段,直到只剩一个数
Sort(src, Start, mid);
Sort(src, mid + 1, End);
//合并数
ComBine(src, Start, mid, End);
}
return true;
}
int main()
{
int src[] = {124, 35, 24 ,6 ,4 ,21 ,1 ,543543, 3322, 2, 32 , 54353, 23211 ,12, 23};
int size = 15;
Sort(src, 0, 14);
for(int i = 0; i < size; ++i)
{
cout<<src[i]<<" ";
}
cout<<endl;
while(1)
{
}
return 0;
}