算法——排序——归并排序

来源:互联网 发布:手动剃须刀推荐知乎 编辑:程序博客网 时间:2024/06/05 14:30

</pre>描述:<p></p><p><span style="white-space:pre"></span>1.先将它分成两半,分别排序,然后将结果归并</p><p><span style="white-space:pre"></span>2.O(nlogn)(最好与最坏都一样)</p><p><span style="white-space:pre"></span>3.稳定的排序</p><p>Code:</p><p>自顶向下(体现分治法的思想)</p><p></p><pre code_snippet_id="1643953" snippet_file_name="blog_20160412_2_2719246" name="code" class="python">class Sort:    arrTemp = None    @classmethod    def sort(cls,arr):        arrTemp = [0 for i in range(0, len(arr))]        cls.sortMerge(arr, 0, len(arr) - 1)    @classmethod    def sortMerge(cls, arr, lo, hi):        if hi <= lo :            return        mid = lo + (hi - lo)/2        cls.sortMerge(arr, lo, mid)        cls.sortMerge(arr, mid + 1, hi)        cls.merge(arr, lo, mid, hi)    @classmethod    def merge(cls, arr, lo, mid, hi):        i = lo        j = mid + 1        arrTemp = arr[:]        k = lo        while k <= hi:            if arrTemp[j] < arrTemp[i]:                arr[k] = arrTemp[j]                j += 1                k += 1            else:                arr[k] = arrTemp[i]                i += 1                k += 1            while i > mid and k <= hi:                arr[k] = arrTemp[j]                k += 1                j += 1            while j > hi and k <= hi:                arr[k] = arrTemp[i]                i += 1                k += 1


自底向上(适合于链表)

class Sort:    arrTemp = None    @classmethod    def sort(cls, arr):        n = len(arr)        arrTemp = [0 for i in range(0, n)]        size = 1        while size < n:            lo = 0            while lo < n - size:                cls.merge(arr, lo, lo+size - 1, min(lo+size+size-1, n - 1))                lo += size + size            size = size + size        return    @classmethod    def merge(cls, arr, lo, mid, hi):        i = lo        j = mid + 1        arrTemp = arr[:]        k = lo        while k <= hi:            if arrTemp[j] < arrTemp[i]:                arr[k] = arrTemp[j]                j += 1                k += 1            else:                arr[k] = arrTemp[i]                i += 1                k += 1            while i > mid and k <= hi:                arr[k] = arrTemp[j]                k += 1                j += 1            while j > hi and k <= hi:                arr[k] = arrTemp[i]                i += 1                k += 1


0 0