sort函数

一个Quicksort究竟可以写到多么短

你说的曾经没有我的故事 提交于 2020-01-08 18:38:04
本文转载自: https://www.cnblogs.com/figure9/archive/2010/12/10/1902711.html 作者:figure9 转载请注明该声明。 一个Quick sort 究竟可以写到多么短 说实话,我从来没有能一次写对一个快速排序,总是有各种各样的错误。 快排麻烦就麻烦在,没办法去调试它,因为它是 生成递归 的,只能去静态调试,或者是不断的打印数组的状态以推测错误的可能性。然而快排的基本思想却是极其简单的: 接收一个数组,挑一个数,然后把比它小的那一摊数放在它的左边,把比它大的那一摊数放在它的右边,然后再对这个数左右两摊数递归的执行快排过程,直到子数组只剩一个数为止。 下面我先用最常用的C语言来写一个快速排序: 首先可以先写出一些伪代码: void quicksort(int array[], int left, int right) { //Do nothing if left <= right //p <- Get a number from array //Put elements <= p to the left side //Put elements >= p to the right side //Put p in the middle slot which index is pivot //Recursive quicksort

树状数组 --- (离散化+树状数组、求逆序对)

陌路散爱 提交于 2020-01-08 05:04:13
G.Inversions There are N integers (1<=N<=65537) A1, A2,.. AN (0<=Ai<=10^9). You need to find amount of such pairs (i, j) that 1<=i<j<=N and A[i]>A[j]. Input The first line of the input contains the number N. The second line contains N numbers A1...AN. Output Write amount of such pairs. Sample Input Sample test(s) Input 5 2 3 1 5 4 Output 3 【题目来源】:BUN 【题目大意】:求逆序对的个数 【题目分析】 求逆序对有很多方法,比如说用合并排序、分治、树状数组、线段树,甚至连暴力(冒泡排序)也可以做,但是要注意会不会超时。 这里就讲一下树状数组的方法,这一题最有意思的是离散化的方法,这个方法在处理大数据的排序方面很有用,离散化能够有效的降低时空复杂度,他可以改进一个低效的算法。除了加上了一个离散化,其他的用树状数组就可以解决。 1、什么是离散化? 用我的理解来说就是一种映射,为什么能用离散化呢?或者说离散化能用在哪些方面呢? 举个例子说吧 ,在排序

排序算法

陌路散爱 提交于 2020-01-07 21:51:14
目录 主方法求解递归式 比较排序 插入排序 归并排序(Merge Sort) 堆排序 优先队列(Priority queues) 快速排序 Partition 过程 快排性能分析 线性时间排序 计数排序 基数排序 桶排序 主方法求解递归式 常需要求解递归式来计算算法的运行时间。递归树方法不细说,较为直观。主方法提供一种菜谱式方法,熟悉之后使用起来最方便: 如果某个算法,将规模为 n 的问题分解为 a 个子问题,每个子问题规模为 n/b,其中 a 和 b 均为正常数。a 个子问题递归地求解,每个花费时间 T(n/b),且将子问题分解与合并子问题花费的时间为函数 f(n)。则算法的运行时间可以描述为 T(n) = aT(n/b) + f(n) 若对某个常数 ε > 0,有 \(f(n)=O(n^{log_{b}a - \epsilon})\) ,则 \(T(n)=\Theta(n^{log_{b}a})\) 若 \(f(n)=\Theta(n^{log_{b}a})\) ,则 \(T(n) = \Theta(n^{log_{b}a}lgn)\) 若对某个常数 ε > 0,有 \(f(n)=\Omega(n^{log_{b}a + \epsilon})\) ,且对某个常数c<1和所有足够大的 n 有 \(af(n/b) \leq cf(n)\) ,则 \(T(n) = \Theta(f

十大经典排序算法(动图演示)

心不动则不痛 提交于 2020-01-03 05:15:25
0、算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序 :通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。 线性时间非比较类排序 :不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。 0.2 算法复杂度 0.3 相关概念 稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 不稳定 :如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。 时间复杂度 :对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。 空间复杂度: 是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。 1、冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 1.1 算法描述 比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数; 针对所有的元素重复以上的步骤,除了最后一个;

常见排序算法

旧巷老猫 提交于 2020-01-03 05:04:42
索引 1. 插入排序 1.1 直接插入 1.2 折半插入 1.3 希尔排序 2. 交换排序 2.1 冒泡排序 2.2 快速排序 3. 选择排序 3.1 直接选择 3.2 堆排序 4. 归并排序 4.1 迭代归并 总结 1. 插入排序 思想 :每步将一个待排序的对象, 按其排序码大小, 插入到前面已经排好序的一组对象的适当位置上, 直到对象全部插入为止。 1.1 直接插入 1.1.1 方法: 当插入第i (i >= 1) 个对象时, 前面的V[0], V[1], …, V[i-1]已经排好序。这时, 用V[i]的排序码依次与V[i-1], V[i-2], …的排序码顺序进行比较, 找到插入位置即将V[i]插入, 原来位置上的对象向后顺移。 具体过程: 1. 把n个待排序的元素看成为一个“有序表”和一个“无序表”; 2. 开始时“有序表”中只包含1个元素,“无序表”中包含有n-1个元素; 3. 排序过程中每次从“无序表”中取出第一个元素,依次与“有序表”元素的关键字进行比较,将该元素插入到“有序表”中的适当位置,有序表个数增加1,直到“有序表”包括所有元素。 1.1.2 实例图: 1.1.3 代码: /** * 直接插入排序:将数组从小到大排序 */ #include <iostream> using namespace std; typedef int Index;//下标的别名

十大经典排序算法动画与解析

◇◆丶佛笑我妖孽 提交于 2020-01-03 04:57:11
排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为 内部排序 和 外部排序 。 内部排序是数据记录在内存中进行排序。 而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。 用一张图概括: 时间复杂度与空间复杂度 关于时间复杂度: 平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序。 线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序; O(n1+§)) 排序,§ 是介于 0 和 1 之间的常数。 希尔排序 线性阶 (O(n)) 排序 基数排序,此外还有桶、箱排序。 关于稳定性: 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。 不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。 1. 冒泡排序 1.1 算法步骤 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 1.2 动画演示 冒泡排序动画演示 1.3 参考代码 1 // Java 代码实现 2 public

python实现各种常用算法之排序算法(11)

ぐ巨炮叔叔 提交于 2020-01-01 02:46:45
python实现排序算法(三) 堆排序 堆排序(Heapsort)的基本思想:是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。 算法原理 堆排序基本思想是: 将初始待排序关键字序列(R1,R2…Rn)构建成大顶堆,此堆为初始的无序区。 将堆顶元素 R[1]与最后一个元素 R[n]交换,此时得到新的无序区(R1,R2,…Rn-1)和新的有序区(Rn),且满足 R[1,2…n-1]<=R[n]。 由于交换后新的堆顶 R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,…Rn-1)调整为新堆,然后再次将 R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2…Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为 n-1,则整个排序过程完成。 复杂度分析 最坏复杂度: 时间复杂度为 O(nlogn) 最好复杂度:时间复杂度在 O(nlogn) 平均复杂度: 时间复杂度为 O(nlogn) 算法实现 import random def heap_sort ( sequence ) : def heap_adjust ( parent ) : #左孩子 child = 2 * parent + 1 #孩子的索引值小于堆的长度 while child <

awk命令简单实用

若如初见. 提交于 2019-12-30 18:56:21
把要分析的文件放到cywin 目录"home/{当前登录用户名}/" 下,这个好像是可以配置。 分析日志的页面访问,按次数排序,次数多的在最后 awk '{print $4}' click.log | sort | uniq -c| sort -n 所有文件被访问的次数. awk '{print $7}' access_log|sort |uniq -c|sort -nr 所有访问源IP的链接次数. awk '{print $1}' access_log | sort |uniq -c |sort -nr cat access_log.2007-01-19.log | awk -F" " '{print $1}' | sort |uniq -c | sort -rn awk -F" " '{print $1}' #用空格分隔,打印第一列数据 sort|uniq -c # 排序并过滤重复,-c 输出重复次数 sort –rn # 按-n数字进行-r反向排序 ----------------以下没实验过-可参考--------------------------------------------------------- ----------------------------------------------------------------------------------

快速排序变种实现:一次宏定义引发的熬夜事件

最后都变了- 提交于 2019-12-30 01:34:11
一、背景     睡前忽然想写两行代码练练手,想起快速排序的一种变种实现,于是写了快速排序,在理论上完全没问题的情况下测试结果却很诡异,debug半天发现是宏定义导致,作为经验教训记录下来。 二、快速排序变种实现   原理:     |_| |_| |_________________________________________|     L R unSorted ---------------------------------------------------------------------------------------------------------------------    1、取哨兵下标为low,即首元素;初始状态L和R集合都为空,L集合用来存放小于pivot的值,R集合用于存放大于pivot的值。 pivot = vector<T>& vec[low] ; mi = low; ↓mi |——| |_| |_| |_________________________________________|     L R unSorted    2、遍历初始集合,如果发现当前下标元素值大于pivot则迭代器加1,不做任何操作,效果相当于移动元素到R中。 idx |_| |__| |______________________________________

排序(python)

我的未来我决定 提交于 2019-12-28 05:03:52
1 # 冒泡算法:是一种简单排序,重复的遍历要排序的数列,一次比较两种元素,如果顺序错误,就交换两者的位置,重复的的进行知道没有在需要交换 2 # 步骤如下: 3 # 冒泡排序算法的运作如下: 4 # 第一次进行遍历,进行n-1次两两比较,将最大(小)的元素,进行放入最后一位,下一次,对前n-2的元素进行两两进行比较.放入最后第二位.... 5 # 时间复杂度为:(稳定) 6 # 最小为o(n),即该序列的有序的序列,最大为o(n),即,第一次要n-1,n-2,n-3...即最大为o(n^2) 7 import random 8 def produce_num(n): 9 return_nums=[] 10 for i in range(n): 11 num=random.randint(1,n) 12 return_nums.append(num) 13 return return_nums 14 def bubble_sort_high(list_): 15 # 进行升序排序 16 # 控制循环轮数 17 for i in range(len(list_)-1): 18 # 每一次遍历,两两比较,得到最大(小)的元素放入,当前循环长度的最后一位 19 for j in range(len(list_)-i-1): 20 # 如果取出的元素大于剩余的元素,则进行交换元素 21