排序-蓝桥杯

一、排序算法

  • 基于比较的低效算法:

选择排序、插入排序、冒泡排序。时间复杂度O(n2)。

  • 基于比较的高效算法:

归并排序、快速排序、堆排序。时间复杂度O(nlogn)。

  • 基于数值划分的高效算法:

计数排序、基数排序、桶排序。时间复杂度O(n)。

二、sort()函数和sorted()函数

1.sort()和sorted()的区别

  • sort()是应用在list上的方法;在原列表上排序。

  • sorted()可以对所有可迭代的对象进行排序操作;产生一个新的列表,不改变原列表。

  • 实例对比如下:

2.细说sorted()函数

  • 语法:

sorted(iterable,key=None,reverse=False)

  • 参数说明:

  1. iterable:可迭代对象。

  1. key:用来进行比较的元素,只有一个参数,具体的函数的参数取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。

  1. reverse:排序规则,reverse = True 降序,reverse = False 升序(默认)

  1. 返回值:重新排序的列表。

  • 实例:

3.部分排序

sort()不能在一部分上做排序,只能整体排序。

sorted()可以部分排序,但是不能在原数据上排序。

4.函数的应用实例1

补充join函数

语法:

'sep'.join(sep_object)

参数说明:

sep:分割符,可为“ ,、;”等。

sep_object:分割对象,可为字符串、以及储存字符串的元组、列表、字典。

作用:

连接任意数量的字符串(包括要连接的元素字符串、元组、列表、字典),用新的目标分隔符连接,返回新的字符串。

6.函数的应用实例2

(1)超时做法

(2)巧妙做法

7.函数的应用实例3

二、结构体排序

sort()和sorted()都能对结构体排序

1.简介写法

s.sort(key=lambda x:x[i],reverse=True)
a=sorted(s,key=lambda x:x[i],reverse=True)

2.自己写比较函数

def cmp():
    s.sort(key=functools.cmp_to_key(cmp))
    a=sorted(s,key=functools.cmp_to_key(cmp))

3.经典例题1

(1)简洁写法

(2)自写比较函数cmp()

三、部分排序

Python的sort()或 sorted(),没有C++的sort()灵活

sort()不能在数组的一部分上做排序,只能对整个数组排序。只能先拷贝出要排序的部分,排序后再拷贝回去。

sorted()虽可以对一部分排序,但是不能直接在原数组上排序。同样也需要拷贝。

1.经典例题1

(1)sort()代码

(2)sorted()代码

2.经典例题2

(1)硬算+排序

由于Python编码简洁,即使硬算出所有3、5、7的倍数,然后再排序找到59084709587505的位置,也容易编码。

(2)暴力搜

这个系列的数可以表示为3ix5jx7,搜索所有不超过范围的i、i、k组合即可。

Python不用担心大数,循环时顺便取个很大的范围作为终止条件,代码中最小的350肯定超过59084709587505。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
归并排序是一种常见的排序算法,它采用分治的思想,将待排序的序列不断地分割成较小的子序列,然后再将子序列进行合并,最终得到有序的序列。 归并排序的基本思想是: 1. 将待排序序列不断地二分,直到每个子序列只有一个元素。 2. 将相邻的子序列进行合并,合并时比较两个子序列的元素大小,将较小的元素放入新的临时数组中。 3. 重复步骤2,直到所有子序列都合并为一个有序序列。 以下是归并排序的C语言实现示例(蓝桥杯题目可能会有一些变化,这里给出的是基本的实现): ```c #include <stdio.h> // 合并两个有序数组 void merge(int arr[], int left, int mid, int right) { int i, j, k; int n1 = mid - left + 1; int n2 = right - mid; // 创建临时数组 int L[n1], R[n2]; // 将数据复制到临时数组 for (i = 0; i < n1; i++) L[i] = arr[left + i]; for (j = 0; j < n2; j++) R[j] = arr[mid + 1 + j]; // 合并临时数组到原数组 i = 0; j = 0; k = left; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } // 复制剩余元素 while (i < n1) { arr[k] = L[i]; i++; k++; } while (j < n2) { arr[k] = R[j]; j++; k++; } } // 归并排序 void mergeSort(int arr[], int left, int right) { if (left < right) { int mid = left + (right - left) / 2; // 分割数组 mergeSort(arr, left, mid); mergeSort(arr, mid + 1, right); // 合并数组 merge(arr, left, mid, right); } } int main() { int arr[] = {5, 2, 8, 3, 1}; int n = sizeof(arr) / sizeof(arr); printf("原始数组:"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } mergeSort(arr, 0, n - 1); printf("\n排序后的数组:"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ranzi.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值