插入排序

2019.9.23-插入排序2

时光毁灭记忆、已成空白 提交于 2019-11-30 06:35:56
# coding:utf-8 def insert_sort(alist): """插入排序""" n = len(alist) for j in range(1, n): # j = [1, 2, 3, n-1] # i 代表內層循環起始值 i = j # 執行從右邊的無序序列中取出第一個元素,即i位置的元素,然後將其插入到前面的正確位置中 while i > 0: if alist[i] < alist[i-1]: alist[i], alist[i-1] = alist[i-1], alist[i] i -= 1 else: break if __name__ == "__main__": li = [54, 26, 93, 17, 77, 31, 44, 55, 20] print(li) insert_sort(li) print(li) 执行结果 来源: https://www.cnblogs.com/lishuide/p/11570162.html

插入排序

邮差的信 提交于 2019-11-30 06:10:20
1 package com.datastack.search; 2 3 import java.util.Arrays; 4 5 //插入排序 6 public class InsertSort { 7 public static void main(String[] args) { 8 int[] arr = new int[]{1,3,5,2,5,5,512,231,123,556,669}; 9 insertSort(arr); 10 System.out.println(Arrays.toString(arr)); 11 } 12 public static void insertSort(int[] arr){ 13 for(int i=1;i<arr.length;i++){ 14 int temp = arr[i]; 15 int left = i-1; 16 while(left>=0 && arr[left] > temp){ 17 arr[left+1] = arr[left]; 18 left--; 19 } 20 arr[left+1] = temp; 21 } 22 } 23 } 来源: https://www.cnblogs.com/linux777/p/11566197.html

python 十大经典排序算法

只愿长相守 提交于 2019-11-30 03:32:30
python 十大经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括: 关于时间复杂度: 平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序。 线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序。 O(n1+§)) 排序,§ 是介于 0 和 1 之间的常数。 希尔排序。 线性阶 (O(n)) 排序 基数排序,此外还有桶、箱排序。 关于稳定性: 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。 不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。 名词解释: n:数据规模 k:“桶”的个数 In-place:占用常数内存,不占用额外内存 Out-place:占用额外内存 稳定性:排序后 2 个相等键值的顺序和排序之前它们的顺序相同 冒泡排序 冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成

选择排序,插入排序学习笔记

家住魔仙堡 提交于 2019-11-30 01:39:53
[算法教程] 几种经典排序的实现 @blibili正月点灯笼 选择排序: 对于一个乱序数组(size=n) 1.寻找其中的最大(小)值 2.放到最右边(和最后一位交换位置) 3.再从原数组size=n-1同样寻找最大值(此时这个是整个数组第二大的值了(如果有两个相同最大值不影响)) 4.继续放到在size=n-1的最右处 5.一直循环到size=1结束排序 数据举例: 3 7 4 2 6 1 (size = 6) 遍历第一遍,找到max = 7;放到最右边,此时: 3 1 4 2 6 7 -->我们需要的是 3 1 4 2 6(size = 5) 遍历,找到max = 6;放到最右边(当然6本来就在最右边,操作后仍不变),此时: 3 1 4 2 6 --> 3 1 4 2(size = 4) 遍历,找到max = 4;放到最右边 3 1 2 4 --> 3 1 2 (size = 3)以此类推 代码实现: #include<stdio.h> #include<iostream> using namespace std; void selection_sort(int *arr,int n); int findmax(int *arr,int n); void swap(int *a,int *b); int main(){ int arr[]={1,3,4,5,7,3,88,44

排序之直接插入排序学习笔记

我们两清 提交于 2019-11-30 01:38:58
每天虽然还是一如既往的早起,晚睡。但是自己好几天没有刷题, 没有看书了。每天都是在各个KTV,饭店,网吧穿梭。跟那些熟悉却略显陌生的老同学聊着自己近状······感谢老天,下了雨(估计要明天就下雪了)把我从各种酒场中救了出来。忽然感觉其实安静的学习才是一件最享受的事情。今天晚上看了一下排序,整理了一下自己的学习笔记。   插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。 直接插入排序基本思想 1.直接插入排序的基本思想 直接插入排序(Straight Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。 把a[i]插入到a[0],a[1],...,a[i-1]之中的具体实施过程为:先把a[i]赋值给变量t,然后将t依次与a[i-1],a[i-2],...进行比较,将比t大的元素右移一个位置,直到发现某个j(0<=j<=i-1),使得a[j]<=t或j为(-1),把t赋值给a[j+1]. 2、第i-1趟直接插入排序:  通常将一个记录R[i](i=2,3,

插入排序算法(C语言)

倾然丶 夕夏残阳落幕 提交于 2019-11-30 01:07:52
前言: 这篇博客主要讲插入排序算法的相关内容,当然啦,相比于教科书所举出的冒泡排序,选择排序等排序方式,这个相对要难一些,不过,万变不离其中,只要你热爱算法,那就来看一下我的这篇博客吧! 题目:  给定一乱序数组,和需插入的值,请你利用编程输出一个新的数组,其元素只包括乱序数组元素和要插入的元素,且是按升序排列。 输入样例: 4 1 3 4 5 2 1 2 3 4 5 分析: 首先我们先把给定的乱序数组进行升序排列。 再则找出数组中第一个大于要插入的数的索引,再此将后面的元素右移一位,并保存在新数组中。 代码: #include<stdio.h> const int N=1000; //定义一个数组所能包含的元素个数 int n,a[N]; int main(){ while(scanf("%d",&n)==1){ int stack[N],top=0,i; //实现一个栈,其top表示栈顶 for(i=0;i<n;i++){ scanf("%d",&a[i]); } int j=1,A=1; i=0; //j的结果会影响最后的输出结果 while(i<n){ if(A==a[i]){ A++; i++; } else if(top&&stack[top]==a[i]){ top--; //top--表示栈指针-1,指向栈顶 i++; } else if(A<=n){ stack[

浅入浅出 Java 排序算法

蹲街弑〆低调 提交于 2019-11-29 17:37:06
Java String 源码的排序算法 一、前言 Q:什么是选择问题? 选择问题,是假设一组 N 个数,要确定其中第 K 个最大值者。比如 A 与 B 对象需要哪个更大?又比如:要考虑从一些数组中找出最大项? 解决选择问题,需要对象有个能力,即比较任意两个对象,并确定哪个大,哪个小或者相等。找出最大项问题的解决方法,只要依次用对象的比较(Comparable)能力,循环对象列表,一次就能解决。 那么 JDK 源码如何实现比较(Comparable)能力的呢? 二、java.lang.Comparable 接口 Comparable 接口,从 JDK 1.2 版本就有了,历史算悠久。Comparable 接口强制了实现类对象列表的排序。其排序称为自然顺序,其 compareTo 方法,称为自然比较法。 该接口只有一个方法 public int compareTo(T o); ,可以看出 入参 T o :实现该接口类,传入对应的要被比较的对象 返回值 int:正数、负数和 0 ,代表大于、小于和等于 对象的集合列表(Collection List)或者数组(arrays) ,也有对应的工具类可以方便的使用: java.util.Collections#sort(List) 列表排序 java.util.Arrays#sort(Object[]) 数组排序 那 String

八大排序算法python实现

我只是一个虾纸丫 提交于 2019-11-29 15:20:48
一、概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 我们这里说说八大排序就是内部排序。 当n较大,则应采用时间复杂度为 O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短; unsortedList=[55, 91, 63, 71, 72, 7, 74, 16, 4, 31, 100, 51, 94, 35, 49, 46, 43, 59, 18, 17] 二、 算法 实现 1.插入排序——直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。 要点:设立哨兵,作为临时存储和判断数组边界之用。 直接插入排序示例: 从后往前插入 如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序, 所以插入排序是稳定的。 (无哨兵)直接插入排序——算法的实现: def

常用的比较排序算法总结

佐手、 提交于 2019-11-29 15:15:49
写在前面 一直很惧怕算法,总是感觉特别伤脑子,因此至今为止,几种基本的排序算法一直都不是很清楚,更别说时间复杂度、空间复杂度什么的了。 今天抽空理了一下,其实感觉还好,并没有那么可怕,虽然代码写出来还是磕磕绊绊,但是思想和原理还是大致上摸清楚了,记录、分享。 另一篇文章: 三种非比较排序算法总结 说明 关于排序,前辈们已经讲解的够多了,我这里主要摘录一些概念。 排序算法分类 比较排序,时间复杂度为O(nlogn) ~ O(n^2),主要有: 冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序 等 非比较排序,时间复杂度可以达到O(n),主要有: 计数排序,基数排序,桶排序 等 排序稳定性 排序算法稳定性的简单形式化定义为:如果Ai = Aj,排序前Ai在Aj之前,排序后Ai还在Aj之前,则称这种排序算法是稳定的。 常用排序算法总结(一) 关于时间复杂度和空间复杂度 选择排序 选择排序每次比较的是数组中特定索引的值与全数组中每个值的大小比较,每次都选出一个最小(最大)值,如果当前索引的值大于之后索引的值,则两者进行交换 // 分类 -------------- 内部比较排序 // 数据结构 ---------- 数组 // 最差时间复杂度 ---- O(n^2) // 最优时间复杂度 ---- O(n^2) // 平均时间复杂度 ---- O(n^2) // 所需辅助空间 --

插入排序法代码

北城余情 提交于 2019-11-29 08:58:09
插入排序相比于冒泡排序效率会高一些,它 的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。简单易懂,下面上代码。 public static void main(String args[]) { int nums[] = creatNums(); long time1 = System.currentTimeMillis(); InsertSort(nums); System.out.println("总耗时" + (System.currentTimeMillis() - time1) + "ms"); } public static int[] creatNums() { Random random = new Random(); int[] temp = new int[100000]; for (int i = 0; i < 100000; i++) { temp[i] = random.nextInt(100000); } return temp; } /** * 插入排序法, 排序100000个随机数,需要5324ms * * @param array */ public static void InsertSort(int[] array) { int length = array.length; for