插入排序

十大经典排序排序算法学习总结(C++实现)

倖福魔咒の 提交于 2020-02-07 21:48:55
常用算法总结记录一下,否则会变得只记得算法名,也可能名都记不住。 图片和动图(我不会画),但我从网上找到了资源。 代码我用C/C++实现的,运行结果都有验证。 时间复杂度和空间复杂度我还没有研究,各种地方抄到的,以后有时间再研究,如果有错误,还请指正。   In/out-place: 不占/占额外内存 1.冒泡排序  冒泡排序算法原理:   比较相邻的元素。如果第一个比第二个大,就交换他们两个。   循环重复以上步骤,直到没有任何一对元素需要比较。   还有位前辈也画的挺好,我也把图贴过来了。  冒泡排序时间复杂度、空间复杂度、稳定性   冒泡排序时间复杂度:最好 O( n) 最坏 O( n 2 ) ,平均 O( n 2 ) 。   冒泡排序空间复杂度: O( 1 ) 。   冒泡排序是一种 稳定 排序算法。  冒泡排序源码实现 1 #include <iostream> 2 using namespace std; 3 4 5 template <typename T> 6 void BubbleSort(T arr[], int len) 7 { 8 if (NULL == arr || 0 >= len) 9 return; 10 11 int i = 0, j = 0, nFlag = 0; 12 13 for (i = 0; i < len - 1; i++) 14 {

图解排序算法(二)之希尔排序

ⅰ亾dé卋堺 提交于 2020-02-07 09:21:58
图解排序算法(二)之希尔排序   希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n 2 )的第一批算法之一。本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现。 基本思想   希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。    简单插入排序很循规蹈矩,不管数组分布是怎么样的,依然一步一步的对元素进行比较,移动,插入,比如[5,4,3,2,1,0]这种倒序序列,数组末端的0要回到首位置很是费劲,比较和移动元素均需n-1次。而希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,然后分组进行插入排序,随后逐步缩小增量,继续按组进行插入排序操作,直至增量为1。希尔排序通过这种策略使得整个数组在初始阶段达到从宏观上看基本有序,小的基本在前,大的基本在后。然后缩小增量,到增量为1时,其实多数情况下只需微调即可,不会涉及过多的数据移动。   我们来看下希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2

图解排序算法(二)之希尔排序

半城伤御伤魂 提交于 2020-02-07 09:21:29
 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n 2 )的第一批算法之一。本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现。 基本思想   希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。    简单插入排序很循规蹈矩,不管数组分布是怎么样的,依然一步一步的对元素进行比较,移动,插入,比如[5,4,3,2,1,0]这种倒序序列,数组末端的0要回到首位置很是费劲,比较和移动元素均需n-1次。而希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,然后分组进行插入排序,随后逐步缩小增量,继续按组进行插入排序操作,直至增量为1。希尔排序通过这种策略使得整个数组在初始阶段达到从宏观上看基本有序,小的基本在前,大的基本在后。然后缩小增量,到增量为1时,其实多数情况下只需微调即可,不会涉及过多的数据移动。   我们来看下希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2...1},称为 增量序列

算法排序之希尔排序

倾然丶 夕夏残阳落幕 提交于 2020-02-07 01:25:56
算法思想 希尔排序其实就是在插入排序的基础上,增加了一个增量,每次为元素划分不同的组 。 该图片转载于此 /** * 希尔排序的实现 希尔排序其实就是在插入排序的基础上,增加了一个增量,每次为元素划分不同的组 * 克服了插入排序相邻两个元素交换的缺点,两个距离较远的元素也可以进行交换。 * @author qiu *思想:定义增量序列DM>DM-1>...>D1=1 *对每个Dk进行“Dk-间隔”排序(K=M,M-1,....1) *最坏的情况T=O(N^2) *缺点:不稳定。 */ public class XiErSort { /** * 原始希尔排序 * @param args */ public static void main ( String [ ] args ) { int [ ] a = { 1 , 8 , 2 , 11 , 20 , 0 } ; for ( int i = 0 ; i < a . length ; i ++ ) { System . out . print ( a [ i ] + " " ) ; } System . out . println ( ) ; shell_sort ( a , a . length ) ; for ( int i = 0 ; i < a . length ; i ++ ) { System . out . print

【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

数组—插入排序:

℡╲_俬逩灬. 提交于 2020-02-02 23:17:07
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 void sort(int data[],int length) 5 { 6 for(int i=0;i<length;i++) 7 { 8 for(int j=i-1;j<i-1;j--) 9 { 10 if(data[j]>data[j+1]) 11 { 12 swap(data[j],data[j+1]); 13 } 14 else 15 { 16 break; 17 } 18 } 19 } 20 } 21 int main(){ 22 int a[10]={9,8,7,6,5,4,3,2,1,0}; 23 sort(a,10); 24 for (int i = 0; i < 10 ; ++i) { 25 cout<<a[i]<<endl; 26 } 27 return 0; 28 } 来源: https://www.cnblogs.com/kblin/p/6946093.html

【Python数据结构与算法笔记day28】6.3. 插入排序

我的未来我决定 提交于 2020-02-02 00:28:49
文章目录 6.3. 插入排序 插入排序 插入排序分析 时间复杂度 插入排序演示 6.3. 插入排序 插入排序 插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 插入排序分析 def insert_sort ( alist ) : # 从第二个位置,即下标为1的元素开始向前插入 for i in range ( 1 , len ( alist ) ) : # 从第i个元素开始向前比较,如果小于前一个元素,交换位置 for j in range ( i , 0 , - 1 ) : if alist [ j ] < alist [ j - 1 ] : alist [ j ] , alist [ j - 1 ] = alist [ j - 1 ] , alist [ j ] alist = [ 54 , 26 , 93 , 17 , 77 , 31 , 44 , 55 , 20 ] insert_sort ( alist ) print ( alist ) 时间复杂度 最优时间复杂度:O(n) (升序排列,序列已经处于升序状态) 最坏时间复杂度:O(n2) 稳定性:稳定

排序算法-插入排序

你。 提交于 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 <

排序算法03-插入排序

£可爱£侵袭症+ 提交于 2020-01-31 21:44:01
简单插入排序 /** * 时间复杂度为O(n^2) */ # include <iostream> using namespace std ; //这里从1号元素开始排序 void InsertSort ( int * nums , int len ) { int temp ; for ( int i = 2 ; i < len ; i ++ ) { if ( nums [ i ] < nums [ i - 1 ] ) { //待排序元素放在0号位置,如果待排序元素当前不是最小,那么提前插入 //如果待排序元素当前是最小,也不会越界,起到哨兵作用 nums [ 0 ] = nums [ i ] ; //在有序部分找到合适的地方,让nums[i]插入 for ( int j = i - 1 ; nums [ j ] > nums [ 0 ] ; j -- ) { nums [ j + 1 ] = nums [ j ] ; temp = j ; //记录当前后移元素 } nums [ temp ] = nums [ 0 ] ; } } } void show ( int * nums , int len ) { for ( int i = 1 ; i < len ; i ++ ) { cout << nums [ i ] << " " ; } } int main ( ) { int

Python基础排序算法之插入排序

十年热恋 提交于 2020-01-31 06:49:48
插入排序 插入排序(Insertion Sort)的基本思想是:将列表分为2部分,左边为排序好的部分,右边为未排序的部分,循环整个列表,每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。 算法分析 (1)时间复杂度 插入排序的时间复杂度为O(n^2) (2)空间复杂度 插入排序的空间复杂度为O(1) 算法特点 1.稳定排序 2.因为要进行折半查找,所以只能用于顺序结构,不能用于链式结构。 2适合初始记录无序,n较大时的情况。 程序示例: "" " 题目 : 插入排序 作者:假书生@ version : 1.0 date : 2020.01 .30 "" " import random # 导入random模块,用来生成随机数列 import time def Insertion_sort ( array ) : # 定义排序函数 for i in range ( 1 , len ( array ) ) : position = i # 刚开始往左边走的第一个位置 current_val = array [ i ] # 先把当前值存下来 while position > 0 and current_val < array [ position - 1 ] : # 当下标大于 0 并且该值小于前一个值时,进入循环 array [