Leetcode 912. 排序数组
本文最后更新于419 天前,其中的信息可能已经过时,如有错误请发送邮件到2446865563@qq.com

1.题目基本信息

1.1.题目描述

给你一个整数数组 nums,请你将该数组升序排列。

1.2.题目地址

https://leetcode.cn/problems/sort-an-array/description/

2.解题方法

2.1.解题思路

十个经典的排序算法:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序、归并排序、基数排序、计数排序、桶排序

2.2.解题步骤

-

3.解题代码

Python代码

class Solution:
    # 10.桶排序(O(n+k),O(n^2),O(n+k),稳定)
    def sortArray(self, nums: List[int]) -> List[int]:
        # 获取分组个数
        maxVal,minVal=max(nums),min(nums)
        if minVal==maxVal:
            return nums
        # 获取桶的个数和分隔间隔
        bucketCnt=int((maxVal-minVal)**0.5)
        bucketWidth=(maxVal-minVal)/bucketCnt
        # 创建桶
        buckets=[[] for i in range(bucketCnt)]
        # 遍历,将数据加到桶中
        for num in nums:
            bucketIndex=int((num-minVal)//bucketWidth)
            bucketIndex=bucketIndex if bucketIndex<bucketCnt else bucketCnt-1
            buckets[bucketIndex].append(num)
        result=[]
        # 将各个桶中的数据进行排序
        for bucket in buckets:
            bucket.sort()
            result.extend(bucket)
        return result

    # 9.计数排序[神奇的过了](0(n+k),0(n+k),0(n+k),O(k),稳定)
    def sortArray9(self, nums: List[int]) -> List[int]:
        minVal,maxVal=min(nums),max(nums)
        counters=[0]*(maxVal-minVal+1)
        for num in nums:
            counters[num-minVal]+=1
        index=0
        for i in range(len(counters)):
            for _ in range(counters[i]):
                nums[index]=i+minVal
                index+=1
        return nums

    # 8.基数排序[错误,因为基数排序只适合正整数/负整数等排序](O(nk),O(nk),O(nk),O(n+k),稳定)
    def sortArray8(self, nums: List[int]) -> List[int]:
        length=len(nums)
        maxVal=max(nums)
        exp=1
        while maxVal//exp>0:
            # 第一步,统计该分位数字的个数
            counters=[0]*10
            for num1 in nums:
                num=(num1//exp)%10
                counters[num]+=1
            # 第二步,统计该分为各个数字的最后一个的索引
            for i in range(1,10):
                counters[i]+=counters[i-1]
            # 第三步,倒序遍历,将数字添加到output中
            output=[0]*length
            for j in range(length-1,-1,-1):
                num=(nums[j]//exp)%10
                output[counters[num]-1]=nums[j]
                counters[num]-=1
            # 将output赋值给nums
            nums=output
            exp*=10
        return nums


    # 7.归并排序(O(nlogn),O(nlogn),O(nlogn),O(n),稳定)
    def sortArray7(self, nums: List[int]) -> List[int]:
        # 归并排序,左毕右开
        def mergeSort(arr,left,right):
            if right-left<=1:
                return
            mid=(right-left)//2+left
            mergeSort(arr,left,mid)
            mergeSort(arr,mid,right)
            copyLeftSortArr=arr[left:mid].copy()
            copyRightSortArr=arr[mid:right].copy()
            copyLeftSortArr.append(inf)
            copyRightSortArr.append(inf)
            # print(copyLeftSortArr,copyRightSortArr)
            i,j,k=0,0,0
            while k<right-left:
                if copyLeftSortArr[i]<copyRightSortArr[j]:
                    arr[left+k]=copyLeftSortArr[i]
                    i+=1
                else:
                    arr[left+k]=copyRightSortArr[j]
                    j+=1
                k+=1
        mergeSort(nums,0,len(nums))
        # print(nums)
        return nums

    # 6.堆排序[附带堆的下滤、上滤、创建、push、pop算法函数](O(nlogn),O(nlogn),O(nlogn),O(1),不稳定)
    def sortArray6(self, nums: List[int]) -> List[int]:
        # 堆的上滤操作
        def upPercolate(heap,pos):
            parentPos=(pos-1)//2
            while parentPos>=0 and heap[pos]<heap[parentPos]:
                heap[pos],heap[parentPos]=heap[parentPos],heap[pos]
                pos=parentPos
                parentPos=(pos-1)//2
        # 堆的下滤操作
        def downPercolate(heap,pos):
            length=len(heap)
            minChildPos=2*pos+1 # 获取最小根节点
            while minChildPos<length:
                if minChildPos+1<length and heap[minChildPos+1]<heap[minChildPos]:
                    minChildPos=minChildPos+1
                if heap[pos]>heap[minChildPos]:
                    heap[pos],heap[minChildPos]=heap[minChildPos],heap[pos]
                pos=minChildPos
                minChildPos=2*pos+1
        # 构建堆
        def heapify(heap):
            # 将所有的父节点逆向进行上滤
            length=len(heap)
            for i in range(length//2,-1,-1):
                downPercolate(heap,i)
        # 弹出堆
        def heappop(heap):
            # 将堆顶最小值和最后一个值互换,然后弹出最后一个(即交换前的堆顶),然后将堆顶下滤进行调整
            length=len(heap)
            heap[0],heap[length-1]=heap[length-1],heap[0]
            ret=heap.pop()
            downPercolate(heap,0)
            return ret
        # 堆增加节点(这里堆排序没有用到)
        def heappush(heap,val):
            # 增加节点到数组末尾并进行上滤
            heap.append(val)
            upPercolate(heap,len(heap)-1)
        heapify(nums)
        # heappush(nums,-10)
        result=[]
        while len(nums)>0:
            result.append(heappop(nums))
        return result

    # 5.选择排序[超时](O(n^2),O(n^2),O(n^2),O(1),不稳定)
    def sortArray5(self, nums: List[int]) -> List[int]:
        length=len(nums)
        for i in range(length):
            for j in range(i,length):
                if nums[j]<nums[i]:
                    nums[j],nums[i]=nums[i],nums[j]
        return nums

    # 4.快速排序[超时](O(nlogn),O(nlogn),O(n^2),O(logn),不稳定)
    def sortArray4(self, nums: List[int]) -> List[int]:
        def quickSort(nums,left,right):
            if left>=right:
                return
            # 选择基准值
            baseVal=random.choice(nums)
            l,r=left-1,right+1
            while l<r:
                # 至少一次递增,防止死循环
                l+=1
                r-=1
                # 找到左边第一个大于baseVal的索引
                while nums[l]<baseVal:
                    l+=1
                # 找出右边第一个小于baseVal的索引
                while nums[r]>baseVal:
                    r-=1
                if l<r:
                    nums[l],nums[r]=nums[r],nums[l]
            quickSort(nums,left,r)
            quickSort(nums,r+1,right)
        quickSort(nums,0,len(nums)-1)
        # print(nums)
        return nums

    # 3.冒泡排序[超时](O(n),O(n^2),O(n^2),O(1),稳定)
    def sortArray3(self, nums: List[int]) -> List[int]:
        length=len(nums)
        for i in range(length):
            flag=False  # 标记该轮冒泡是否有交换
            for j in range(length-i-1):
                if nums[j+1]<nums[j]:
                    nums[j+1],nums[j]=nums[j],nums[j+1]
                    flag=True
            if not flag:
                break
        # print(nums)
        return nums

    # 2.希尔排序(O(n),O(n^1.3),O(n^2),O(1),不稳定)
    def sortArray2(self, nums: List[int]) -> List[int]:
        dist=length=len(nums)
        while dist>0:
            dist=int(dist//2)
            for i in range(dist):
                for j in range(i,length,dist):
                    temp=nums[j]
                    k=j-dist
                    while k>=0 and nums[k]>temp:
                        nums[k+dist]=nums[k]
                        k-=dist
                    nums[k+dist]=temp
        # print(nums)
        return nums

    # 1.直接插入排序[超时](O(n),O(n^2),O(n^2),O(1),稳定)
    def sortArray1(self, nums: List[int]) -> List[int]:
        length=len(nums)
        for i in range(length):
            temp=nums[i]
            j=i-1
            while j>=0 and temp<nums[j]:
                nums[j+1]=nums[j]
                j-=1
            nums[j+1]=temp
        # print(nums)
        return nums

4.执行结果

觉得有帮助可以投喂下博主哦~感谢!

作者:geek007

转载请注明文章地址及作者哦~
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇