码迷,mamicode.com
首页 > 编程语言 > 详细

内排序-归并排序

时间:2018-08-18 11:34:35      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:ring   说明   col   排序   amp   ++   for   bsp   stat   

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

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];

} 
}

}

 

 

 

内排序-归并排序

标签:ring   说明   col   排序   amp   ++   for   bsp   stat   

原文地址:https://www.cnblogs.com/mytrip/p/9478269.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!