归并排序

https://www.cnblogs.com/chengxiao/p/6194356.html
原理可以看下这位大大的博客,图片描述的很棒

调用递归,第一次讲一个数组分成两部分,然后先对左部分进行操作,再次递归划分最后将其划分成两两一组的小数组,在小数组内比较,变成有序的小数组,然后递归返回,开始合并,将几个有序的小数组并成一个有序的大数组,然后右部分重复上述操作,最后形成两个有序数组,在进行并。。。

package sort;

public class DArray
{
    private int [] array = { 9 , 5 , 3 , 6 , 7 , 8 , 12 , 33 } ;
    private int size  ;
    private int [] workSpace ;

    public DArray ()
    {
        size = array.length ;
        workSpace = new int [size] ;
    }

    public void sort ()
    {
        merge1 ( workSpace , 0 , size - 1 ) ;

    }

    //将数组细分,最后分成两两一组
    public void merge1 ( int [] w , int left , int right )
    {
        if ( left < right )
        {
            int mid = ( left + right ) / 2 ;

            merge1 ( w , left , mid ) ;
            merge1 ( w , mid + 1 , right ) ;
            merge ( w , left , mid , right ) ;
        }

    }

    //组内进行比较,排序,结果是保证组内有序
    public void merge ( int [] w , int left , int mid , int right )
    {
        int l = left ;//左部分开始索引
        int m = mid + 1 ;//右部分开始索引
        int i = 0 ;//临时数组的索引

        while ( l <= mid && m <= right )
        {
            if ( array [l] < array [m] )
            {
                w [i++] = array [l++] ; 
            }
            else
            {
                w [i++] = array [m++] ;
            }
        }

        //将剩余数据导入到临时数组中
        while ( l <= mid )
        {
            w [i++] = array [l++] ;
        }

        while ( m <= right )
        {
            w [i++] = array [m++] ;
        }

        //将临时数组中数组导入到原数组中,完成排序
        i = 0 ;
        while ( left <= right )
        {
            array [left++] = w [i++] ; 
        }

    }

    //遍历
    public void display ()
    {
        for ( int i = 0 ; i < size ; i ++)
        {
            System.out.print ( array [i] + " " );
        }
    }
}
发布了43 篇原创文章 · 获赞 25 · 访问量 4万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章