学习笔记-数据结构(一):排序

(一)按时间复杂度分类

时间复杂度为o(n*n)的排序方法有:冒泡排序、插入排序、选择排序。

1-冒泡排序

假设数组长度为n。在0-n-1范围内,从0位置的元素开始,比较位置0的元素与位置1的元素的大小,若位置1的元素小于位置0的元素,则交换位置,再比较位置1和位置2元素,依次类推。遍历完0-n-1之后,最大的元素会在位置n-1上。接下来在0-n-2范围内重复上述操作。直到比较范围变成0.

def maopao(nums):
    l=len(nums)
    for i in range(0,l-1):
        for j in range(1,l):
            if nums[j] < nums[j-1]:
                nums[j-1],nums[j] = nums[j],nums[j-1]
    return nums
a=maopao([1,3,2,4,0])
print(a)

2-选择排序

假设数组长度为n。在0-n-1范围内选择最小的元素放在位置0,;然后在1-n-1范围内选择最小的元素放在位置;依次类推,直到范围变成(n-1)-n为止。

def xuanze(nums):
    for i in range(0,len(nums)):
        min_idx = i
        for j in range(i+1,len(nums)):
            if nums[j] < nums[min_idx]:
                min_idx = j
        nums[i],nums[min_idx] = nums[min_idx],nums[i]
    return nums
a=xuanze([3,1,2,0,8])
print(a)

3-插入排序

插入排序跟冒泡排序的过程相似。假设数组长度为n,在0-n-1范围内,比较位置0和位置1的元素,若位置1的元素小于位置0,则交换顺序。再比较位置2和位置1的元素,若位置2小于位置1,则交换,交换完之后再用位置1和位置0的元素比较,若位置1小于位置0则交换位置0和位置1的元素。执行完前k个元素,则前k个元素一定是有序的。

def insert(nums):
   l=len(nums)
   for i in range(1,l):
       x=nums[i]
       for j in range(i,-1,-1):
           if x<nums(j-1):
               nums[j] = nums[j-1]
           else:
               break
        nums[j] = x
    return nums
squ = insert([1,3,2,4])#example
print([i for i in squ])
           

时间复杂度为o(n*log(n))的排序方法:归并排序、快速排序、堆排序和写排序。

1-归并排序

首先将数组分成单独的序列,将相邻两个元素变成有序的。再扩大有序范围为4,即将已经有序的相邻的两个元素再排序,及数组的有序单元长度为4,依次类推,知道有序长度等于数组长度。

2-快速排序

在数组中随机选择一个数a,将小于a的数放在a的左边,大于a的数放在a的右边。然后分别在a左边和a的右边递归执行以上操作。

3-希尔排序

希尔排序与插入排序相似,只不过是步长不同。假设设置步长为3,则从位置为3的元素开始,比较位置3和位置1的元素,若位置3小于位置1的元素,则交换位置。然后进行位置4与位置2的匀速比较,若位置4大于位置2,则交换停止。进行位置5与位置3,若位置5小于位置3则交换两元素位置,再比较位置3与位置0,若位置3小于位置0,则交换,否则停止交换。遍历完整个数组之后第一次排序结束。调整步长,重复上述操作。知道步长为1执行完则得到有序数组。

4-堆排序

(还没完全理解,之后补充)堆顶位置元素最大,最大放在最后。

(二) 按稳定性分类

稳定性是相同值的元素再排序前和排序后相对位置保持不变。

稳定的排序算法有:冒泡、插入、归并、计数、基数、桶排序。

不稳定的排序算法有:选择、快速、希尔、堆排序。

补充:数组长度较小时选择插入排序。而当数组长度较大时,选择快速排序或其他复杂度为o(n*log(n))的排序方法。

 

其他的排序及实现的代码之后补充。^ _ ^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值