插入排序

面试准备(算法部分)

断了今生、忘了曾经 提交于 2020-01-03 04:58:40
No.1 冒泡排序 冒泡排序无疑是最为出名的排序算法之一,从序列的一端开始往另一端冒泡(你可以从左往右冒泡,也可以从右往左冒泡,看心情),依次比较相邻的两个数的大小(到底是比大还是比小也看你心情)。 冒泡排序动图演示 图解冒泡排序 以 [ 8,2,5,9,7 ] 这组数字来做示例,上图来战: 从左往右依次冒泡,将小的往右移动 冒泡排序1 首先比较第一个数和第二个数的大小,我们发现 2 比 8 要小,那么保持原位,不做改动。位置还是 8,2,5,9,7 。 指针往右移动一格,接着比较: 冒泡排序2 比较第二个数和第三个数的大小,发现 2 比 5 要小,所以位置交换,交换后数组更新为:[ 8,5,2,9,7 ]。 指针再往右移动一格,继续比较: 冒泡排序3 比较第三个数和第四个数的大小,发现 2 比 9 要小,所以位置交换,交换后数组更新为:[ 8,5,9,2,7 ] 同样,指针再往右移动,继续比较: 冒泡排序4 比较第 4 个数和第 5 个数的大小,发现 2 比 7 要小,所以位置交换,交换后数组更新为:[ 8,5,9,7,2 ] 下一步,指针再往右移动,发现已经到底了,则本轮冒泡结束,处于最右边的 2 就是已经排好序的数字。 通过这一轮不断的对比交换,数组中最小的数字移动到了最右边。 接下来继续第二轮冒泡: 冒泡排序5 冒泡排序6 冒泡排序7 由于右边的 2 已经是排好序的数字

链表插入排序(insertion-sort-list)

佐手、 提交于 2020-01-02 01:17:53
自己写的代码有几个比较大的用例一直过不去,网上的代码大部分有问题,思路是先将链表置空表,再将链表中的元素循环插入到指定位置。 下面是一份正确的代码,但是是 带头节点的链表 : void Insertsort(Linklist &L) { LNode *p,*q,*r,*u; p=L->next;L->next=NULL; //置空表,然后将原链表结点逐个插入到有序表中 while(p!=NULL) { //当链表尚未到尾,p为工作指针 r=L;q=L->next; while(q!=NULL&&q->data<=p->data) { //查P结点在链表中的插入位置,这时q是工 作指针 r=q;q=q->next; } u=p->next; p->next=r->next; r->next=p; p=u; //将P结点链入链表中,r是q的前驱,u是下一个待插入结点的指针 } } 本题是 没有头节点的链表 ,修改后如下: void Insertsort(Linklist &L) {   ListNode *p,*u,*r,*q,*s; /*h2用来指向需要插入的结点,h3用来指向h2的前一个结点   p=L->next;   L->next=NULL; //置空表,然后将原链表结点逐个插入到有序表中   while(p!=NULL)   { //当链表尚未到尾,p为工作指针     r

【leetcode】147 Insertion Sort List

一世执手 提交于 2020-01-02 01:14:53
插入排序 题意 使用插入排序对一个单链表进行排序 思路 说实话,没思路。先看看数组的插入排序吧,也许能找到灵感: 数组插入排序 数组的插入排序,需要对数组进行两重遍历,第一次找到一个比前面数字小的一个数字,说明它需要被移动到前面去,所以再从当前节点开始从后往前遍历,将每一个比其大的数字都往后移一位,直到找到一个比它小的数字,然后插入在这个数字后面,代码如下: public static void insertSort(int[] array) { int len = array.length; if(len <= 1) return; //从第二位开始遍历,找到前一位比后一位大的数字,说明该数字需要被插入到前面去 for(int i=1;i<len;i++) { if(array[i-1] > array[i]) { //临时变量保存array[i] int temp = array[i]; int j=i; //从后往前把所有比temp大的数往后移一位 while (j>0 && array[j-1] > temp) { array[j] = array[j-1]; j--; } //把temp放在比temp小的数的后面 array[j] = temp; } } for(int i : array) System.out.printf("%d\t", i); } 链表插入排序

十大基础排序算法-scala编写

本秂侑毒 提交于 2020-01-01 21:39:45
十大基础排序算法-scala编写 1、前言 2、排序 2.1、排序分类 2.2、影响因素 3、冒泡排序 4、选择排序 5、插入排序 6、希尔排序 7、归并排序 8、快速排序 9、堆排序 10、计数排序 11、桶排序 12、基数排序 1、前言 最近补了一下《数据结构与算法》的相关知识,这里记录一下常见的十大排序算法。因为最近自己在学习 scala ,所以下面都是使用的 scala 进行编程,其与 java 语法有很多类似,保留了 java 的面向对象编程,同时拥有函数式编程。 (用什么语言都一样,算法思路对就行。) 2、排序 2.1、排序分类 根据在排序的过程中待排序的记录是否全部被放置在内存中,排序分为:内排序和外排序 其中,内排序是在排序的整个过程中,待排序的所有记录全部被放置在内存中。外排序是由于排序的次数个数太多,不能同时放置在内存中,整个排序过程需要在内外存之间多次交换数据才能进行。 根据内排序过程中借助的主要操作,我们把内排序分为:插入排序、交换排序、选择排序、归并排序。 常见的内排序有: 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序 2.2、影响因素 对于内排序来说,排序算法的性能主要是受3个方面影响: 时间性能 排序是数据处理中经常执行的一种操作,往往属于系统的核心部分,因此排序算法的时间开销是衡量其好坏的最重要的标志

Java排序之排序大综合

感情迁移 提交于 2020-01-01 14:57:05
一、最近写了一些排序,于是和和大家分享一下:(默认都是从小到大排序) 二、冒泡排序   1、什么是冒泡排序:原理是临近的两个数比较大小,将较大的数往后移,这样遍历一趟数组以后,最大的数就排在的最后面(时间复杂的为O(N2))    重复上面步骤N次。   2、原理描述:data{44,77,55,33,66}       第一次运行:data{44,55,33,66,77}       第二次运行:data{44,33,55,66,77}       。。。。。。       第N次执行:data{33,44,55,66,77}   3、参考代码: import java.util.Arrays; /** * Description:冒泡排序 * Author: Hey * Date: 2015/12/7 */ public class BubbleSort { public static void main(String[] args) { int[] data = {11, 66, 33, 44, 77, 55}; for (int i = 0; i < data.length-1; i++) { for (int j = data.length - i; j > 0; j--) { if (data[i] > data[i + 1]) { data[i] = data[i]

PTA-二叉搜索树的插入排序

醉酒当歌 提交于 2019-12-29 20:38:27
二叉搜索树的插入排序 二叉搜索树定义为: 左子树仅包含小于根结点的元素; 右子树仅包含大于根结点的元素; 左右子树均为二叉搜索树。 一棵二叉搜索树可以有不同的插入顺序。例如,对于如下的二叉搜索树 figure.png 插入序列可以是 3 2 1 4 6 5, 也可以是 3 2 4 1 6 5 但不可以是 3 2 4 5 6 1。 下面给出一棵二叉搜索树的先序遍历序列,请编写程序求出该树的插入序列个数。考虑到总数可能非常大,请输出总数对 1000000007 (10 ​9 ​​ +7)取余的结果。 输入格式: 第一行给出一个整数 N (0<N<=100),表示二叉树中元素个数; 第二行给出 N 个正整数,以空格分隔,表示二叉树的先序遍历序列; 输出格式: 在一行中输出插入序列总数。 输入样例: 6 3 2 1 4 6 5 输出样例: 10 解题思路 1、先构造杨辉三角(用于存放组合数)。 2、先根据输入的序列先序构造成一个树。 3、根据这个已经构造好的二叉树计算它的插入序列总数,具体计算方式如下 对于一个结点 1、如果是叶子结点,那么它的插入序列只有一种 2、若果只有左子树,那么它的插入序列数和他的左子树一样 3、如果只有右子树,那么它的插入序列数和他的右子树一样 4、如果左右子树都有,则它的插入序列数等于左子树的序列个数 右子树的序列个数 (组合数)C(左子树的元素个数

插入排序算法

有些话、适合烂在心里 提交于 2019-12-28 20:08:05
  #include <stdio.h>   #include <stdlib.h>   void output(int *a,int len);   void InsertSort(int *array, int len);   int main()   {     int a[6]={1,5,2,9,4,3};     InsertSort(a,6);     output(a,6);     printf("\n");     system("pause");     return 0;   }   void InsertSort(int *array, int len)   {   int i;   for(i=1;i<len;i++)     {       int cur=i; //当前位置       int last=cur-1; //上一个位置       int temp = array[cur];       while(array[last] > temp && last>=0) //当前大小小于上一个       {         array[last+1]=array[last]; //上一个后移         last--;       } //当前小于等于上一个       array[++last]=temp; // 插入当上一个后面     

基本排序算法--插入排序随笔

孤街浪徒 提交于 2019-12-28 11:28:31
简介 插入排序是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。 插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。 插入排序算法性能 插入排序在最好的情况下是 O(n) ,在最坏的情况下是 O(n^2) 的。数组越接近有序,插入排序所需的工作就越少。 流程图解 java代码实现 * * * 插入排序 * / public class InsertionSort extends Sort { public int [ ] sortOne ( int [ ] arr ) { for ( int i = 1 ; i < arr . length ; i ++ ) { //插入排序

排序(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

重读算法导论之算法基础

本小妞迷上赌 提交于 2019-12-27 14:51:32
重读算法导论之算法基础 插入排序 ​ 对于少量数据的一种有效算法。原理: 整个过程中将数组中的元素分为两部分,已排序部分A和未排序部分B 插入过程中,从未排序部分B取一个值插入已排序的部分A 插入的过程采用的方式为: 依次从A中下标最大的元素开始和B中取出的元素进行对比,如果此时该元素与B中取出来的元素大小关系与期望不符,则将A中元素依次向右移动 ​ 具体代码如下: public static void insertionSort(int[] arr) { // 数组为空或者只有一个元素的时候不需要排序 if (arr == null || arr.length <= 1) { return; } // 开始插入排序,先假设元素组第一个元素属于已经排好序的A部分,依次从B部分取出元素,进行比较插入 for (int j = 1; j < arr.length; j++) { int key = arr[j]; int i = j - 1; for (; i >= 0; i--) { if (arr[i] > key) { arr[i + 1] = arr[i]; } else { break; } } arr[i+1] = key; } } ​ 易错点为,最后应该是设置arr[i + 1] = key。 可以设想假设A中所有元素都比B中选出来的数小的时候