插入排序

数据结构(一) 单链表的实现-JAVA

匿名 (未验证) 提交于 2019-12-02 21:53:32
该内容为转载,原地址: 数据结构(一) 单链表的实现-JAVA       数据结构还是很重要的,就算不是那种很牛逼的,但起码得知道基础的东西,这一系列就算是复习一下以前学过的数据结构和填补自己在这一块的知识的空缺。加油。珍惜校园中自由学习的时光。按照 链表 、栈、队列、排序、数组、树这种顺序来学习数据结构这门课程把。                             -WH 一、单链表的概念       链表是最基本的数据结构,其存储的你原理图如下图所示                  上面展示的是一个单链表的存储原理图,简单易懂,head为头节点,他不存放任何的数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,而每个节点中都有一个next引用,指向下一个节点,就这样一节一节往下面记录,直到最后一个节点,其中的next指向null。       链表有很多种,比如单链表,双链表等等。我们就对单链表进行学习,其他的懂了原理其实是一样的。 二、用java实现单链表       语言只是一种工具,数据结构真正体会的是那种思想,这句话确实是这样,不管用什么写,其思想是不改变的。以前使用的是C++,现在用的是java,一步步来实现。       2.1、编写一个Node类来充当结点的模型。我们知道,其中有两个属性,1存放数据的data,2存放下一结点的引用,       

Java中的七大排序_1 插入排序

匿名 (未验证) 提交于 2019-12-02 21:52:03
一:七种排序 插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序 二、排序思想(以非降序排列为例) 简单点说: 将待排元素分为有序区间和无序区间,并假设第一个元素已经有序。每次取出无序区间的第一个值记作key吧,将它与有序区间的元素从后往前进行比较,大于等于有序区间最后一个数,就放后边当成新的有序区间的最后一个数;小于的话,就继续往前比较,直到找到一个比它还小的有序区间的数,并把key插入到该值的后边。 注意: 我们在有序区间插入元素时,一定要提前空好位置在做插入操作,如果直接插入,会导致原来数据被覆盖而丢失。所以要先将插入位置之后的 有序区间 的元素从后往前依次向后移动一下,(从后往前,还是为了避免数据被覆盖)。这样操作后,就会将插入位置空出,此时,在将key插入 三、图示:以排18292415224为例 1.将元素分为有序区间和无序区间,并假设第一个元素已经有序 2.key从无序区间第一个开始有序的下一个),key=8大于等于有序区间最后一个数,就放后边当成新的有序区间的最后一个数,接着进行下一步的key值比较定位 3.key=2,小于有序区间的最后一个数8,就继续往前比较,直到找到一个比它还小的有序区间的数,在该数之后做插入 4.先将插入位置之后的有序区间的元素从后往前依次向后移动一下,腾出空位,插入key 5.key=9,key>=8

Java排序算法之插入排序

匿名 (未验证) 提交于 2019-12-02 21:52:03
1.插入排序(Insertion Sorting)基本思想 把n个待排序的元素看成为一个有序表和一个无序表 开始时有序表中只包含一个元素,无序表中包含有n-1个元素 排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置 使之成为新的有序表。 插入排序的时间复杂度为:O(n 2 ) 2.图解 3. 代码实现 1)逐步推导 : {101, 34, 119, 1} 第1轮 { 101 , 34, 119, 1}; => { 34, 101 , 119, 1} {101, 34, 119, 1}; => {101,101,119,1} {101,101,119,1}; => {34,101,119,1} 第2轮 { 34, 101 , 119, 1}; => { 34, 101, 119 , 1} 第3轮 { 34, 101, 119 , 1}; => { 1, 34, 101, 119 } {34, 101, 119, 1}; => {34, 101, 119, 119} {34, 101, 119, 119}; => {34, 101, 101, 119} {34, 101, 101, 119}; => {34, 34, 101, 119} {34, 34, 101, 119}; => {1, 34, 101, 119} /

八大排序算法

让人想犯罪 __ 提交于 2019-12-02 20:10:24
一、直接插入排序 原理 :直接插入排序(Straight Insertion Sorting)的基本思想:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。 public void insertSort(int[] arr) { int len = arr.length; int insertNum; for(int i=1; i < len; len++) { insertNum = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > insertNum) { arr[j+1] = arr[j]; j--; } arr[j+1] = insertNum; } } 二、希尔排序 针对直接插入排序的效率问题,有人对次进行了改进与升级,这就是现在的希尔排序。 希尔排序 ,也称 递减增量排序算法 ,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率 但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位 对于直接插入排序问题,数据量巨大时。 将数的个数设为n,取奇数k=n/2

插入排序——Python实现

你。 提交于 2019-12-02 16:47:33
插入排序Python实现 # -*- coding: utf-8 -*- # @Time : 2019/10/28 20:47 # @Author : yuzhou_1shu # @Email : yuzhou_1shu@163.com # @File : insertion_sort.py # @Software: PyCharm def insertion_sort(collection): """Python实现插入排序算法 将插入排序模拟成抓扑克牌: 1、当抓到第一个牌肯定是有序的 2、然后抓到第二张牌,如果比第一张大,放在右边;如果小,放在第一张左边;相等,左右都可以 :param collection: 待排序序列 :return: 升序排好的对应序列 """ length = len(collection) # 第一张牌肯定有序,所以循环变量从1开始(也就是第二张牌开始插入),i代表摸到的牌 for i in range(1, length): insertion_index = i while(insertion_index > 0 and collection[insertion_index - 1] > collection[insertion_index]): collection[insertion_index], collection[insertion

链表排序之插入排序

我们两清 提交于 2019-12-02 16:32:17
链表排序之插入排序算法: public static ListNode insertionSortList(ListNode head) { if (null == head || null == head.next){ return head; } ListNode preHead = new ListNode(-1); preHead.next = head; ListNode cur = head; while (null != cur){ ListNode pre = preHead; ListNode next = cur.next; while (null != next && cur.val <= next.val){ next = next.next; cur = cur.next; } if (null == next){ break; } while (pre.next.val <= next.val){ pre = pre.next; } cur.next = next.next; next.next = pre.next; pre.next = next; } return preHead.next; } 排序前:6 2 8 4 9 5 1 3 7 排序后:1 2 3 4 5 6 7 8 9 来源: https://www.cnblogs.com

4.插入排序

做~自己de王妃 提交于 2019-12-02 12:19:11
1.插入排序简介 2.插入排序图解 3.代码 public class InsertSort { public static void main ( String [ ] args ) { int [ ] arr = { 101 , 34 , 119 , 1 } ; InsertSort . insertSort ( arr ) ; } /** * 插入排序 * @param arr */ public static void insertSort ( int [ ] arr ) { //{101,34,119,1} //int i = 1:第1个数为有序表 for ( int i = 1 ; i < arr . length ; i ++ ) { //待插入的数 int insertVal = arr [ i ] ; //insertVal在第一轮排序时是34 //insertVal:待插入的位置 int insertIndex = i - 1 ; //insertVal<arr[insertIndex]:表示insertVal没有找到位置 while ( insertIndex >= 0 && insertVal < arr [ insertIndex ] ) { arr [ insertIndex + 1 ] = arr [ insertIndex ] ; //arr

[算法]插入排序

隐身守侯 提交于 2019-12-02 06:58:32
算法复杂度为O(n^2) 基本思想是:类似于摸牌,在手中的牌已经排好序,摸一张牌,寻找合适的位置,一个一个的比较,找到合适的位置插入 #include <QCoreApplication> #include <iostream> #include <algorithm> #include <vector> using namespace std; void insertSort(int a[],int size) { int i,j; for(j=1;j<size;j++) { int key = a[j]; i=j-1; while(i>0 && a[i]>key) { a[i+1]=a[i]; i=i-1; } a[i+1]=key; } } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); int A[5]={1,3,2,5,4}; insertSort(A,5); for(auto s:A) { cout<<s<<" "; } cout<<endl; return a.exec(); } 来源: https://www.cnblogs.com/tailiang/p/11735648.html

C++面试中的排序算法总结

梦想与她 提交于 2019-12-02 06:48:56
查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题。但万变不离其宗,只要熟悉了思想,灵活运用也不是难事。一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码。对这两种排序的代码一定要信手拈来才行。还有插入排序、冒泡排序、堆排序、基数排序、桶排序等。 面试官对于这些排序可能会要求比较各自的优劣、各种算法的思想及其使用场景。还有要会分析算法的时间和空间复杂度。通常查找和排序算法的考察是面试的开始,如果这些问题回答不好,估计面试官都没有继续面试下去的兴趣都没了。所以想开个好头就要把常见的排序算法思想及其特点要熟练掌握,有必要时要熟练写出代码。 接下来我们就分析一下常见的排序算法及其使用场景。限于篇幅,某些算法的详细演示和图示请自行寻找详细的参考。 冒泡排序 冒泡排序是最简单的排序之一了,其大体思想就是通过与相邻元素的比较和交换来把小的数交换到最前面。这个过程类似于水泡向上升一样,因此而得名。举个栗子,对5,3,8,6,4这个无序序列进行冒泡排序。首先从后向前冒泡,4和6比较,把4交换到前面,序列变成5,3,8,4,6。同理4和8交换,变成5,3,4,8,6,3和4无需交换。5和3交换,变成3,5,4,8,6,3.这样一次冒泡就完了,把最小的数3排到最前面了

C++希尔排序

纵然是瞬间 提交于 2019-12-02 06:47:37
希尔排序的提出: 直接插入排序算法的问题: 若一个最小的值在后面,那么当排这个最小值的时候需要一步步移动,将其移动到序列的最前面,那么有没有什么方法减少这种移位? 我们不希望一步一步移动,而是给它设置一个增量让其大步移动,希尔排序由此产生,同时希尔排序打破了排序算法时间复杂度不能低于 O ( n 2 ) O ( n 2 ) //--> 。 希尔排序采用跳跃分割的策略: 将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后的得到的结果基本有序而不是局部有序。 这里简单介绍一下基本有序的概念:小的关键字基本在前面,大的基本在后面,不大不小的基本在中间,像{2,1,,3,6,4,7,5,8,9}就可以称为基本有序,{1,5,9,3,7,8,2,4,6}就不能称为基本有序,因为最大的9在第三位,并且很小的2在导数第三位。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。 2.但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。 希尔排序的基本思想: 先取小于 n n //--> 的整数 d 1 d 1 //--> 作为第一个增量,把全部记录分组。所有距离为 d 1 d 1 //--> 倍数的记录放在同一组中,先在各组内进行 直接插入排序 ;然后,去第二个增量 d