题解 | #排序#

排序

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)
不稳定

全部评论

相关推荐

星辰再现:裁员给校招生腾地方
点赞 评论 收藏
分享
程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
ohs的小木屋:比不少实习待遇高了
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务