排序算法稳定性

【ARTS】01_05_左耳听风-20181210~1216

谁都会走 提交于 2020-02-05 02:31:39
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algorithm 【leetcode】125验证回文串 https://leetcode.com/problems/valid-palindrome/ 1)problem 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我们将空字符串定义为有效的回文串。 示例 1: 输入: "A man, a plan, a canal: Panama" 输出: true 示例 2: 输入: "race a car" 输出: false 2)answer 1、普通思路 把数字和字符提取出来,然后如果是字母就转换为小写。加到新的字符串中。 对于这个新的字符串,使用一个多条件循环,分别从字符串头、字符串尾遍历字符串的中间值,如果不一致就退出。直到遍历结束还是一致就判定为回文字符串。 2、高级思路 在discuss看到的答案。 用一个大循环分别从字符串头、字符串尾遍历字符串的中间值,里面两个小循环,用isalnum()函数判断是不是字母数字,如果不是就向前移动指针。 https://leetcode.com/problems/valid-palindrome

Java排序算法

拟墨画扇 提交于 2020-02-04 00:53:35
排序算法 一、概述 排序算法(Sort Algorithm),排序是将一组数据依指定的顺序进行排列的过程 1. 分类 1.1 内部排序 将需要处理的所有数据都加载到**内部存储器(内存)**中进行排序 1.2 外部排序 数据量过大时,无法全部加载到内存中,需要借助外部存储器进行排序 2. 常见排序算法 二、算法的时间复杂度 1. 时间频度 一个算法花费的时间与算法中语句的执行次数成正比例,算法中语句的执行次数越多,则它花费的时间就越多。 一个算法中的语句执行次数称为语句频度或时间频度 ,记为: T(n) 2. 举例说明 2*n+20和2n随着n的增大,两个表达式的结果会逐渐接近 2n 2+3n+10和2n 2随着n增大,两个表达式的值会逐渐接近 随着n的增大,5n 2+7n和3n 2+2n结果逐渐接近 结论 : 常数项可以忽略 低次项可以忽略 高次项系数可以忽略 3. 时间复杂度 一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n) / f(n)的极限值为不等于零的常数,则称f(n)为T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度 T(n)不同,当时间复杂度可能相同。如:T(n)=n 2+7n+6与T(n)=3n 2+2n

【Python数据结构与算法笔记day25】6. 排序与搜索+排序算法的稳定性

自古美人都是妖i 提交于 2020-02-02 01:03:57
文章目录 6. 排序与搜索 排序与搜索 排序算法的稳定性 6. 排序与搜索 排序与搜索 排序算法(英语:Sorting algorithm)是一种能将一串数据依照特定顺序进行排列的一种算法。 排序算法的稳定性 稳定性 :稳定排序算法会让原本有相等键值的纪录维持相对次序。也就是如果一个排序算法是稳定的,当有两个相等键值的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。 当相等的元素是无法分辨的,比如像是整数,稳定性并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。 (4, 1) (3, 1) (3, 7)(5, 6) 在这个状况下,有可能产生两种不同的结果,一个是让相等键值的纪录维持相对的次序,而另外一个则没有: (3, 1) (3, 7) (4, 1) (5, 6) (维持次序) (3, 7) (3, 1) (4, 1) (5, 6) (次序被改变) 不稳定排序算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此。不稳定排序算法可以被特别地实现为稳定。作这件事情的一个方式是人工扩充键值的比较,如此在其他方面相同键值的两个对象间之比较,(比如上面的比较中加入第二个标准:第二个键值的大小)就会被决定使用在原先数据次序中的条目,当作一个同分决赛。然而,要记住这种次序通常牵涉到额外的空间负担。 来源: CSDN 作者:

【Python数据结构与算法笔记day27】6.2. 选择排序

不羁岁月 提交于 2020-02-02 00:41:16
文章目录 6.2. 选择排序 选择排序 选择排序分析 时间复杂度 选择排序演示 6.2. 选择排序 选择排序 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。 选择排序分析 排序过程: 红色表示当前最小值,黄色表示已排序序列, 蓝色表示当前位置。 def selection_sort ( alist ) : n = len ( alist ) # 需要进行n-1次选择操作 for i in range ( n - 1 ) : # 记录最小位置 min_index = i # 从i+1位置到末尾选择出最小数据 for j in range ( i + 1 , n ) : if alist [ j ] < alist [ min_index ] : min_index = j # 如果选择出的数据不在正确位置

排序算法-插入排序

你。 提交于 2020-02-01 00:30:20
package com.redis.order; /** * 插入/希尔/归并 * 1.时间效率 * 2.空间复杂度 * 3.比较次数&交换次数 * 两个操作: * 1:比较 * 2:交换 * 4.稳定性 */ 特点:对一个已有顺序的序列进行排序 public class Sort1 { /** * 插入排序: * 生活场景:打扑克 * 手中的扑克进行排序 * @param args */ public static void main(String[] args) { int a[] = {9, 8, 7, 0, 1, 3, 2}; int length = a.length; for (int i = 1; i < length; i++) { //为什么从1开始?第一个不用排序,把数组从i=1分开 int data = a[i]; //后面的数 int j = i - 1; //前面的下标 for (; j >= 0; j--) { if (a[j] > data) { //拿着第一个数跟前面的数据进行比较,a[j]前面的数据 a[j + 1] = a[j]; //数据往后移动. } else { break; } } a[j + 1] = data; System.out.println("第" + i + "次排好序的结果为:"); for (j = 0; j <

ios学习笔记---排序算法

寵の児 提交于 2020-01-31 00:11:28
排序算法 1.概念   所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。 2.选择排序算法时常用的几个参照   a.稳定性     假定在带排序的记录序列中,存在多个具有相同关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r i = rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。   b.时间复杂度     计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。     时间复杂度常用 大O符号 表述,不包括这个函数的低阶项和首项系数。   c.空间复杂度 3.算法   冒泡排序     原理:比较相邻的元素。如果第一个比第二个大,就交换他们两个。        对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。        针对所有的元素重复以上的步骤,除了最后一个。        持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。   选择排序   插入排序   希尔排序   快速排序   归并排序   基数排序   二叉树排序    来源: https://www.cnblogs.com/jintie0123/p

排序算法-希尔排序(Shell Sort)

自作多情 提交于 2020-01-29 16:37:12
文章目录 希尔排序法介绍 希尔排序法算法 时间复杂度 稳定性 其他排序法的比较 希尔排序法介绍 希尔排序法(Shell Sort)是 D.L.Shell 于1959年提出的一种排序算法,是 直接插入排序法 的更高效的改进版。在这之前的排序算法如 冒泡排序 、 简单选择排序 、 直接插入排序 等算法的的时间复杂度都为 O ( n 2 ) O(n^{2}) O ( n 2 ) ,而希尔排序突破了这一时间复杂度。 【原理】 直接插入排序算法比冒泡排序和简单选择排序性能都要高,尤其在序列基本有序并且记录数相对较少的情况,只需要简单的几个插入动作就能完成排序。 希尔排序的思路就是在插入排序算法的基础上,创造插入排序算法的有利条件,将序列按照某个增量分成多个子序列进行插入排序,使整个序列变为基本有序,并且由于按照增量分了子序列,所以每个子序列的记录数变少了,增量和子序列长度成反比,增量从小于n的某个值每次递减,子序列随增量变小而变长。直到增量变为1,使其所有记录为一个整体序列然后进行一次插入排序为止。 什么才叫基本有序呢?比如{2,1,4,3,5,6,8,7,9}可以说是基本有序,小的数字基本在序列的前部,不大不小的在中部,大的数字在后部。 {8,7,6,3,9,2,4,5,1}这样的序列就不是基本有序,因为1在序列的最后,9在中间,8在第一位,所以谈不上是基本有序的。 【例子】

排序算法概述

落爺英雄遲暮 提交于 2020-01-28 16:46:46
基本概念 什么是排序 排序是计算机内经常进行的一种操作,将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序。 什么是稳定性 定义 能保证两个相等的数,经过排序之后,其在序列的前后位置顺序不变。(A1=A2,排序前A1在A2前面,排序后A1还在A2前面)。 意义 稳定性本质是维持具有相同属性的数据的插入顺序 ,如果后面需要使用该插入顺序排序,则稳定性排序可以避免这次排序。 排序分类 内部排序和外部排序 按照是否要访问外存,排序可以分为内部排序和外部排序。 内部排序(In-place) 若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。 外部排序(Out-place) 若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。 稳定排序和不稳定排序 按照稳定性,排序可以分为稳定排序和不稳定排序。 稳定排序 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的。 不稳定排序 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序可能会发生变化,即在原序列中,r[i]=r[j],且r[i]在r[j]之前

经典排序算法总结及关键代码(c++)

蹲街弑〆低调 提交于 2020-01-28 03:56:34
主要是理解动图,结合图和代码来分析理解。 冒泡排序 平均复杂度:O(n2) 空间复杂度:O(1) 稳定性:稳定 冒泡排序 是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 void Bubblesort(vector<int>& a,int n) { for(int i=n-1; i>0; i--) for(int j=0; j<i; j++) { if(a[j]>a[j+1]) swap(a[j],a[j+1]); } } 选择排序 平均复杂度:O(n2) 空间复杂度:O(1) 稳定性:不稳定 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕 vector<int> selectionSort(vector<int>& a) { if (a.size() == 0) return a; for (int i = 0; i < a.size(); i++) { int minIndex = i; for (int j = i; j < a.size(); j++)

算法-12-排序算法应用

被刻印的时光 ゝ 提交于 2020-01-28 01:54:13
目录 1、排序比较 2、算法稳定性 3、指针排序 4、Arrays.sort() 5、找出重复元素 6、找出中位数(第k小的数) 1、排序比较 2、算法稳定性 如果一个排序算法能够保留数组中重复元素的相对位置则可以被称为是 稳定 的。 应用场景:对于记录有大量位置和时间的一个列表库,每条数据的插入都是按照时间顺序插入的,我们现在要对该数组按照地点给来进行排序,拥有稳定性的排序算法在排序之后,时间还具有一定的有序性。上面的各个排序算法比较,记录各自的稳定性。 3、指针排序 在 Java 中,指针操作是隐式的。除了原始数字类型之外,我们操作的总是数据的引用(指针), 而非数据本身。指针排序增加了一层间接性,因为数组保存的是待排序的对象的引用,而非对象本身。 使用引用的另一个好处是我们不必移动整个元素。对于元素大而键小的数组来说这带来的节 约是巨大的,因为比较只需要访问元素的一小部分,而排序过程中元素的大部分都不会被访问到。 对于几乎任意大小的元素,使用引用使得在一般情况下交换的成本和比较的成本几乎相同(代价 是需要额外的空间存储这些引用)。如果键值很长,那么交换的成本甚至会低于比较的成本。研 究将数字排序的算法性能的一种方法就是观察其所需的比较和交换总数,因为这里隐式地假设了 比较和交换的成本是相同的。由此得出的结论则适用于 Java 中的许多应用,因为我们都是在将引 用排序。 4