内排序-归并排序

Posted mytrip

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内排序-归并排序相关的知识,希望对你有一定的参考价值。

基本的算法思想:简单的可以说将原序列划分为 左右两个序列,再令这两个序列分别为有序序列,最后合并这两个有序序列,也称为二路归并;(在递归的最后一个层次里保证左右两个序列各有一个元素,这两个元素很容易有序,递归而去它们的父级序列也就很容易有序,最后整个序列也有有序了)  

package sort;

import java.io.IOException;

public class MergeSort
{
public static void main(String[] args)
{
int[] a = new int[] { 20, 30, 90, 40, 70, 110, 60, 10, 100, 50, 80, 9, 8, 7, 6 };
MergeSort mergesort = new MergeSort();
mergesort.Sort(a, 0, a.length - 1); 
for (int i : a)
{
System.out.println(i); 
} 
} 
public void Sort(int[] arrays, int left_index, int right_index)
{
if (left_index < right_index)//当left_index == right_index 说明是单个元素, 不可再向下递归了
{
int i = left_index;
int j = right_index;
int m = (i + j) / 2;
Sort(arrays, i, m); 
Sort(arrays, m + 1, right_index); 
Merger(arrays, i, m, j);//直到找到两个紧邻的元素
}
} 
void Merger(int[] array, int left, int mid, int right)
{//对同一个数组左右两边的有序队列进行合并
int i = left;
int m = mid;
int j = mid+1;
int k=0;
int[] temp = new int[right - left+1];
while (i <= m && j<= right)
{
//从左右两边找出最小的元素 放入temp队列
if ( array[i] <= array[j]) temp[k++] = array[i++];

if ( array[i] > array[j]) temp[k++] = array[j++]; 
}
//i <= m说明 j指向的队列元素已全部进入temp
while (i <= m)
{
temp[k++] = array[i++];
}
//j<= right说明 j指向的队列元素已全部进入temp
while (j <= right)
{
temp[k++] = array[j++];
}
//序号 left 到 right的元素,重置为排好元素
for (k = 0; k < temp.length;k++)
{
array[left + k] = temp[k];

} 
}

}

 

 

 

以上是关于内排序-归并排序的主要内容,如果未能解决你的问题,请参考以下文章

简述二路归并排序,并分析其算法复杂性.

案例7-1.2 插入排序还是归并排序 (25分)

算法排序归并排序

七大排序算法分析及java实现

排序之归并排序

冒泡快速归并排序