linxihuanghuang

导航

归并排序的详解

归并排序主要就是先分解再合并的一个步骤:

关于合并,以下是合并(合并里面是按大小顺序来合并,相当于排序)的实现代码:

View Code
        void merge(int[] a, int head, int mid, int tail, int[] temp)
        {
            int i, j, k;
            i = head;
            j = mid+1;
            k = 0;
            while (i<=mid&&j<=tail)
            {
                if (a[i] < a[j])
                    temp[k++] = a[i++];
                else
                    temp[k++] = a[j++];
            }
            while (i<=mid)
            {
                temp[k++] = a[i++];
            }
            while (j<=tail)
            {
                temp[k++] = a[j++];
            }
            
            for ( i = 0; i < k; i++)
            {
                a[head+i] = temp[i];
            }
        }

以下是递归实现的代码:(主要就是递归实现分解,分解到不能再分解就开始合并)

View Code
        static void sort(int[] a, int head, int tail, int[] temp)
        {
            if (head < tail)
            {
                int mid = (head + tail) / 2;
                sort(a, head, mid, temp);
                sort(a, mid + 1, tail, temp);
                merge(a, head, mid, tail, temp);
            }
 
        }

关于这里面的一个递归,以下做一个图解,以便更好理解递归的意义:

若待排数组为array[3]={3,1,7}

主函数代码如下:

View Code
       static void Main(string[] args)
        {
            int[] array ={ 3,1,7};
            int head = 0;
            int tail = array.Length - 1;
            int[] temp = new int[array.Length];
            for (int i = 0; i < array.Length; i++)
            {
                temp[i] = array[i];
            }
            sort(array, head, tail, temp);
            for (int i = 0; i < array.Length; i++)
            {
                Console.Write("{0}   ", array[i]);
            }
            
            Console.Read();

        }

由代码可以看出,head=0,tail=2,mid=1
则可以画出以下的递归层次图:

posted on 2013-04-04 14:23  linxihuanghuang  阅读(169)  评论(0编辑  收藏  举报