归并排序的思想很简单,就是将多个有序序列组合成一个新的有序序列。
对于一个无序的序列,我们可以先两两归并,然后四个四个归并,依次类推直到完成排序。这样的排序方式又称之为二路归并排序。
这里贴了我写的归并排序算法java实现片段,采用了非递归方式:
- protected void sortAlg(int[] ls)
- {
- int[] tmp = new int[ls.length];
- for(int len = 1; len < ls.length;)
- {
- int unit = len << 1;
- for(int i = 0; i < ls.length;)
- {
- int end = (i + unit >= ls.length) ? ls.length : i + unit;
- if(i + len >= ls.length)
- {
- break;
- }
- merge(ls, i, i + len - 1, end - 1,tmp);
- if(end == ls.length)
- {
- break;
- }
- i = i + unit;
- }
- len = unit;
- }
- }
- private void merge(int[] ls, int l, int m, int h, int[] tmp)
- {
- int lp = l;
- int hp = m + 1;
- int tmpi = 0;
- assert tmp.length >= (h-l+1) : "tmp array length more";
- while(ls[lp]<=ls[hp] && lp<=m)
- {
- lp++;
- }
- int tmpstart = lp;
- while(tmpi < tmp.length && !(lp > m || hp > h))
- {
- if(ls[lp] > ls[hp])
- {
- tmp[tmpi] = ls[hp];
- hp++;
- }
- else
- {
- tmp[tmpi] = ls[lp];
- lp++;
- }
- tmpi++;
- }
- if(hp > h)
- {
- for(int i = lp; i <= m; i++)
- {
- tmp[tmpi] = ls[i];
- tmpi++;
- }
- }
- for(int i = 0; i < tmpi; i++)
- {
- ls[tmpstart + i] = tmp[i];
- }
- }
protected void sortAlg(int[] ls)
{
int[] tmp = new int[ls.length];
for(int len = 1; len < ls.length;)
{
int unit = len << 1;
for(int i = 0; i < ls.length;)
{
int end = (i + unit >= ls.length) ? ls.length : i + unit;
if(i + len >= ls.length)
{
break;
}
merge(ls, i, i + len - 1, end - 1,tmp);
if(end == ls.length)
{
break;
}
i = i + unit;
}
len = unit;
}
}
private void merge(int[] ls, int l, int m, int h, int[] tmp)
{
int lp = l;
int hp = m + 1;
int tmpi = 0;
assert tmp.length >= (h-l+1) : "tmp array length more";
while(ls[lp]<=ls[hp] && lp<=m)
{
lp++;
}
int tmpstart = lp;
while(tmpi < tmp.length && !(lp > m || hp > h))
{
if(ls[lp] > ls[hp])
{
tmp[tmpi] = ls[hp];
hp++;
}
else
{
tmp[tmpi] = ls[lp];
lp++;
}
tmpi++;
}
if(hp > h)
{
for(int i = lp; i <= m; i++)
{
tmp[tmpi] = ls[i];
tmpi++;
}
}
for(int i = 0; i < tmpi; i++)
{
ls[tmpstart + i] = tmp[i];
}
}
与快速排序和堆排序相比,归并排序的最大特点是,它是一种稳定的排序算法。
转载于:https://blog.51cto.com/shuaigee/1133325