Leecode第三次打卡

排序专题一

1、选择排序

class Solution(object):
    def sortArray(self, nums):
        l = len(nums)    
        for i in range(l-1):
            min_i = i                                     
            for j in range(i+1,l):
                if(nums[min_i]>nums[j]):         
                    min_i = j
            if i != min_i:
                nums[i],nums[min_i] = nums[min_i],nums[i]
        return nums

大循环控制当前将要排序的元素,小循环从将要排序的元素的下一个位置开始遍历,寻找比当前元素更小的元素,若找到则将其下标赋予min_i。

循环结束,若当前元素不是最小,则当前元素与nums[min_i]交换。

2、插入排序

class Solution(object):
    def sortArray(self, nums):
        l = len(nums)    
        for i in range(1,l):
            temp = nums[i]
            j = i
            while j>0 and nums[j-1]>temp:
                nums[j] = nums[j-1]
                j -= 1
            nums[j] = temp
        return nums

1、从数组的第二个元素开始遍历,首先记录它的值至temp中,记录它的下标至j中;

2、当 j大于0 且 当前元素的值temp小于前一个元素的值nums[j-1]时,就将前一个元素向后移一位,循环操作;

3、退出循环后,将temp赋给nums[j],即将i所指的元素插入到升序位置上。

3、希尔排序

class Solution(object):
    def sortArray(self, nums):
        size = len(nums)    
        gap = size//2
        while gap > 0:
            for i in range(gap,size):
                temp = nums[i]
                j = i
                while j>=gap and nums[j-gap]>temp:
                    nums[j] = nums[j-gap]
                    j -= gap
                nums[j] = temp
            gap //= 2
        return nums   

1、希尔排序将数组按照一定的间隔分为若干个组,再利用插入排序进行排序,间隔一般为size/2;

2、递归运行直至间隔为1,虽然原始数组就是间隔为1的数组,但是通过分组的方法可以大大减少运行时间。

4、归并排序

def merge(left_arr, right_arr):
    arr = []
    while left_arr and right_arr:
        if left_arr[0] <= right_arr[0]:
            arr.append(left_arr.pop(0))
        else:
            arr.append(right_arr.pop(0))
    while left_arr:
        arr.append(left_arr.pop(0))
    while right_arr:
        arr.append(right_arr.pop(0))
    return arr

def mergeSort(arr):
    size = len(arr)
    if size < 2:
        return arr
    mid = len(arr) // 2
    left_arr, right_arr = arr[0: mid], arr[mid:]
    return merge(mergeSort(left_arr), mergeSort(right_arr))

归并排序将数组依次分为len(nums)个组,len(nums-1)组……直到1个组,合并组时按照两个组中第一个元素的相对大小进行出栈,当其中一组的元素个数为0时,便直接将另一组的元素按照原来的顺序全部添加到新的数组中,递归上述过程直到所有的组合并为1个数组,完成排序。

5、快速排序

import numpy as np
import sys
np.random.seed(1)
nums = np.random.randint(10,size=8)
print(nums)
def QuickSort(nums,left,right):
    if left >= right:
        return 0
    basenumber = nums[left]
    i = left
    j = right
    while i!=j:
        while i < j and nums[j] >= basenumber:
            j -= 1
        while j > i and nums[i] <= basenumber:
            i += 1
        if i < j:
            nums[i],nums[j] = nums[j],nums[i]

    nums[i],nums[left] = nums[left],nums[i]
    
    QuickSort(nums,left,i-1)
    QuickSort(nums,i+1,right)
QuickSort(nums,0,nums.size-1)
print(nums)
[5 8 9 5 0 0 1 7]
[0 0 1 5 5 7 8 9]

1、左右哨兵分别指向数组第一个与最后一个元素,设置一个基数basenumber = nums[left](数组的第一个元素)

2、首先从右哨兵开始判断,当右哨兵所指的元素值大于等于基数时,向左移动;

然后判断左哨兵,当左哨兵所指的元素值小于等于基数时,向右移动;

3、若跳出循环意味着右哨兵小于基数,左哨兵大于基数。此时交换左右哨兵,重复步骤2

4、当跳出大循环时,说明左哨兵与右哨兵指向了同一个位置,此时将基数与所指位置的值交换,完成第一次排序,

5、递归执行完成快速排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值