《算法导论》二分法排序

来源:互联网 发布:触摸屏查询网站源码 编辑:程序博客网 时间:2024/05/18 15:56

今晚上看到了分治法,就是俗称的二分法。算法代码如下:

        static public void MergeSortAsc(ref int[] arr, int p, int r)        {            if (p < r)            {                int q = (p + r) / 2;                MergeSortAsc(ref arr, p, q);                MergeSortAsc(ref arr, q + 1, r);                MergeAsc(ref arr, p, q, r);            }        }        static public void MergeAsc(ref int[] arr, int p, int q, int r)        {            int leftLength = q - p+1;            int[] leftArr = new int[leftLength + 1];            for (int i = 0; i < leftLength; i++)            {                leftArr[i] = arr[p+i];            }            leftArr[leftLength] = int.MaxValue;            int rightLength = r - q;            int[] rightArr = new int[rightLength + 1];            for (int i = 0; i < rightLength; i++)            {                rightArr[i] = arr[q + i + 1];            }            rightArr[rightLength] = int.MaxValue;            int left = 0;            int right = 0;            for (int i = p; i <= r; i++)            {                if (leftArr[left] < rightArr[right])                {                    arr[i] = leftArr[left];                    left++;                }                else                {                    arr[i] = rightArr[right];                    right++;                }            }        }

如果需要降序的话, 将leftArr[leftLength] = int.MaxValue和rightArr[rightLength] = int.MaxValue,分别改成 leftArr[leftLength] = int.MinValue和rightArr[rightLength] = int.MinValue,然后 leftArr[left] < rightArr[right] 改为leftArr[left] > rightArr[right]。

分析时间复杂度:

当n=1时,

当n>1时,

下面修改的一种,节约了一些空间占用。

        static public void MergeSortAsc(ref int[] arr, int p, int r)        {            if (p < r)            {                int q = (p + r) / 2;                MergeSortAsc(ref arr, p, q);                MergeSortAsc(ref arr, q + 1, r);                MergeAsc_Change_01(ref arr, p, q, r);            }        }        static public void MergeAsc_Change_01(ref int[] arr, int p, int q, int r)        {            int leftLength = q - p + 1;            int[] leftArr = new int[leftLength];            for (int i = 0; i < leftLength; i++)            {                leftArr[i] = arr[p + i];            }            int rightLength = r - q;            int[] rightArr = new int[rightLength];            for (int i = 0; i < rightLength; i++)            {                rightArr[i] = arr[q + i + 1];            }            int left = 0;            int right = 0;            for (int i = p; i <= r; i++)            {                if (left == leftLength)                {                    arr[i] = rightArr[right];                    right++;                    continue;                }                if (right == rightLength)                {                    arr[i] = leftArr[left];                    left++;                    continue;                }                if (leftArr[left] < rightArr[right])                {                    arr[i] = leftArr[left];                    left++;                }                else                {                    arr[i] = rightArr[right];                    right++;                }            }        }



0 0