题解 | #排序#

排序

http://www.nowcoder.com/practice/2baf799ea0594abd974d37139de27896

https://www.cnblogs.com/onepixel/articles/7674659.html

1. 快速排序 快排

时间复杂度:O(nlogn)空间复杂度:O(1)
不稳定

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
# 将给定数组排序
# @param arr int整型一维数组 待排序的数组
# @return int整型一维数组
#
class Solution:
    def MySort(self , arr ):
        # write code here
        self.quick_sort(0, len(arr)-1, arr)
        return arr

    def quick_sort(self, start, end, arr):
        if start >= end:
            return

        left, right = start, end
        pivot = arr[(start + end)//2]

        while left <= right:
            while left <= right and arr[left] < pivot:
                left += 1
            while left <= right and arr[right] > pivot:
                right -= 1

            if left <= right:
                arr[left], arr[right] = arr[right], arr[left]
                left += 1
                right -= 1

        self.quick_sort(start, right, arr)
        self.quick_sort(left, end, arr)

2. 冒泡排序

一对一对的比较 反复loop
367219 - 362179 - 321679 - 213679 - 123679

时间复杂度:O(n^2)空间复杂度:O(1)

3. 选择排序

选一个最大或最小值放在起始位,不断loop后面的找到最值,更新在后面的位置
367219 - 167239 - 127639 - 123679

时间复杂度:O(n^2)空间复杂度:O(1)

4. 插入排序

每次把当前元素跟前面排好的相比,不断地swap到应该在的地方
367219 - 236719 - 123679

时间复杂度:O(n^2)空间复杂度:O(1)

5. 归并排序

时间复杂度:O(nlogn)空间复杂度:O(1)
稳定

class Solution:
    def MySort(self , arr ):
        # write code here
        temp = [0 for _ in range(len(arr))]
        self.merge_sort(0, len(arr) - 1, arr, temp)
        return arr

    def merge_sort(self, start, end, arr, temp):
        if start >= end:
            return

        mid = (start + end) // 2

        self.merge_sort(start, mid, arr, temp)
        self.merge_sort(mid + 1, end, arr, temp)
        self.merge(start, mid, end, arr, temp)

    def merge(self, start, mid, end, arr, temp):
        left, right = start, mid + 1
        index = start

        while left <= mid and right <= end:
            if arr[left] < arr[right]:
                temp[index] = arr[left]
                left += 1
            else:
                temp[index] = arr[right]
                right += 1
            index += 1


        while left <= mid:
            temp[index] = arr[left]
            left += 1
            index += 1

        while right <= end:
            temp[index] = arr[right]
            right += 1
            index += 1

        for index in range(start, end+1):
            arr[index] = temp[index]

6. 堆排序

时间复杂度:O(nlogn)空间复杂度:O(1)
不稳定

全部评论

相关推荐

河和静子:如果大专也能好过的话,我寒窗苦读几年的书不是白读了?
点赞 评论 收藏
分享
评论
4
收藏
分享
牛客网
牛客企业服务