插入排序

插入排序

99封情书 提交于 2019-12-01 07:24:19
插入排序 思路 1.首先对于a[0]这个单个元素来说其自己就是有序的,所以要从a[1]开始 2.第二步是把a[1]这个元素插入a[0]这个列表中 3.如果a[0]比a[1]大的话,a[0]应该给a[1]位置,a[1]=a[0],那么a[0]朝后面移动了一个位置,这样a[1]就可以放到它应有的位置也就是a[0]这个位置了,也就是a[0]=a[1] 4.之后呢,[a[1],a[0]]是有序的了,那么只需要把a[2]插入[a[1],a[0]]这个有序序列使其有序也就可以了 5.按照这个思路依次插入第1到n-1下标对应的元素最终整个数组就有序了 代码 package sort; public class InsertSort { public static void main(String[] args) { // TODO Auto-generated method stub int[] a= {7,6,5,4,3,2,1}; insertSort(a); for (int i = 0; i < a.length; i++) { System.out.printf("%d ",a[i]); } System.out.println(); } //插入排序 public static void insertSort(int[] arr) { int len=arr.length;/

排序算法之插入排序

筅森魡賤 提交于 2019-12-01 06:58:17
插入排序 是一种稳定的排序算法。 基本思想:   把N个待排序元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有N-1个元素;每次从无序表中取出一个元素,将它插入到有序表中,使之成为新的有序表,重复N-1次完成整个排序过程。 算法分析:   1)从序列第一个元素开始,该元素可以认为已经被排序;   2)去下一个元素设为待插入元素,在已排序的序列中从后向前扫描,如果该元素大于带插入元素,将该元素移到下一个位置;   3)重复步骤2),直到找到已排序的元素小于或等于待排序元素的位置,插入元素;   4)重复2),3)步骤,完成排序。 时间复杂度:   1)顺序排列时,只需比较(N-1)次,插入排序的时间复杂度为O(n);   2)逆序排序时,只需比较N(N-1)/2 次,插入排序时间复杂度为O(n 2 );   3)当原始序列是无序时,平均时间复杂度为O(n 2 ); 空间复杂度:   插入排序过程中,需要一个临时变量temp存储待排序元素,因此空间复杂度为O(1) 排序过程图: 接下来看一下具体的Java代码实现: 第一种形式: 1 public void sort(int arr[]) { 2 for(int i =1; i<arr.length;i++) { 3 int insertVal = arr[i]; //插入的数 4 int index = i-1;

希尔排序

ぃ、小莉子 提交于 2019-11-30 23:20:19
由于LeetCode上的算法题很多涉及到一些基础的数据结构,为了更好的理解后续更新的一些复杂题目的动画,推出一个新系列 -----《图解数据结构》,主要使用动画来描述常见的数据结构和算法。本系列包括十大排序、堆、队列、树、并查集、图等等大概几十篇。 文章首发于公众号 五分钟学算法 ,欢迎关注获取更多排序内容。 推荐阅读 「算法与数据结构」从入门到进阶吐血整理推荐书单 希尔排序 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率; 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位; 希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。 算法步骤 选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1; 按增量序列个数 k,对序列进行 k 趟排序; 每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。 来源:https://github.com

基础排序算法

社会主义新天地 提交于 2019-11-30 19:51:35
在读大学的时候,有门专业课,《数据结构》,当时也就是上课老师在上面讲,我们在下面听,不知道其他同学什么情况,反正我课后很少会再去看,考完试之后,那本书也被我封印了。有个室友考研,买个本《数据结构》,严蔚敏与吴伟民著,现在放在我床头,在失眠的时候看一看。现在意识到,算法真的很重要。对一些算法要进行重新学习。当然,不是C语言版本的。C#语言描述的。当做自己学习,以后也方便自己回顾,特意在博客里面记录下来。 排序算法   在日常生活中,人们所接触到的绝大多数数据都是经过排序的。比如,按照字母顺序查找字典中的定义,或者按照字母顺序在电话本中查询电话号码等等。尽管已经对一些比较老的算法进行了改进,但是仍然应该先学习集中简单的排序算法,这些简单排序算法就是插入排序算法、冒泡排序以及选择排序算法。这些算法的每一种都很容易理解和实现。   为了检验这些算法,首先需要构造一个可以实现并测试算法的测试环境,这里将构造一个 封装租处理的一些常规操作,即元素的插入操作,元素存取访问操作,以及显示数组内容的操作。下面就是程序代码: public class CArray { private int[] arr; private int upper; private int numElements; public CArray(int size) { arr = new int[size]; upper =

快速排序,插入排序,冒泡排序,归并排序

Deadly 提交于 2019-11-30 16:58:59
快速排序:O(n 2 ) 真正正确的快速排序: #include<iostream> #include<cstdio> using namespace std; int a[100]; /*void swap(int a,int b){ int tmp; tmp=a; a=b; b=tmp; }*/ void quicksort(int left,int right){ int i,j,t; if(left>right) return; int temp=a[left]; i=left; j=right; while(i<j){ while(a[j]>temp&&i<j) j--; a[i]=a[j]; while(a[i]<temp&&i<j) i++; a[j]=a[i]; } a[i]=temp; quicksort(left,i-1); quicksort(i+1,right); } int main(){ int num; cin>>num; for(int i=1;i<=num;i++) scanf_s("%d",&a[i]); quicksort(1,num); for(int i=1;i<=num;i++) cout<<a[i]<<endl; return 0; } 插入排序: O(n 2 ) #include<iostream> #include<cstdio>

python php 插入排序

纵然是瞬间 提交于 2019-11-30 16:11:45
#!/usr/bin/python def insert_sort(li): #将输入的列表以插入的方式排序 #先取出一个值,进行在已经完成的排序列表上循环比较后进行左或者右的插入完成排序 for i in range(1,len(li)): #假定第一个值是已经排好序的第一个列表 所以从下标1开始 temp = li[i] #循环取出无序列表的值 j = i - 1 #循环获取有序列表的最后值的索引 while j >= 0 and temp < li[j] : # j >= 0 则表明了列表已经达到了最左侧,即列表的第一个值已经比较完成 #并且循环比较已经排序列表中的每一个值,如果小于,则进行位置的变动,否则不需要进行变动结束循环 li[i+1] = li[j] #将大的值插入比较值的左边 j = j - 1 #将循环次数减1 控制列表索引 li[j+1] = temp #将取出来的值放在值的右边 _______________ //插入排序PHP //插入排序 function insert_sort($li) { $li_lenght = count($li); for ($i=1; $i < $li_lenght; $i++) { $temp = $li[$i]; echo $temp; for ($j=$i-1; $j >= 0 && ($temp > $li[$j])

插入排序

非 Y 不嫁゛ 提交于 2019-11-30 13:14:00
/** * 插入排序 (默认第一个数已经排序好,后面每个数与已经排序的数字从后到前比较) * @author Administrator * */ public class TestArray { public static void main(String[] args) { int [] arr = {9,5,8,4,1,3,5,7,2}; int i, j, temp ; for (i = 1; i < arr.length; i++) { temp = arr[i]; for (j = i - 1; j >=0; j--) { if (temp > arr[j]) { break; }else { arr[j + 1] = arr[j]; //arr[j] =temp; //没比较一次就插入一次 } } arr[j + 1] = temp; //比较完之后再插入 } printArr(arr); } public static void printArr(int[] arr) { for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } } 来源: https://www.cnblogs.com/sacai/p/11590639.html

决胜经典算法之插入排序

时光怂恿深爱的人放手 提交于 2019-11-30 09:40:18
习题答案 题目回顾 在上一篇文章中,我们以数列从小到大排列为例,讲了选择排序。结尾处的思考题如下: 如果要实现从大到小排列,上述代码该做如何修改呢? 同样,要解答这个问题也很简单,下面放上答案。 答案 我们知道,从小到大排序时,选择排序就是选出最小的数,并将其放在最开始的位置。同理,从大到小排序时,只需要选出最大的数,将其放在最开始的位置就可以了。参考如下代码: public static void selectSort(int[] arr) { for (int i = 0; i < arr.length; i++) { int min = i; for (int j = i; j < arr.length; j++) { if (arr[j] > arr[min]) { min = j; } } if (min != i) { int temp = arr[i]; arr[i] = arr[min]; arr[min] = temp; } } } 怎么样,你答对了吗? 本篇文章的内容是讲第三种排序方法——插入排序。 还是之前的问题: 问题挑战 现有如下数字: 3,44,38,5,47,15,36,26,27,2,46,4,19,50,48 一共15个数字,请将其从小到大依次排列。 算法解析 所谓“插入排序”,重点在“插入”。具体说来,就是评估数列里面的每一个元素

希尔排序

生来就可爱ヽ(ⅴ<●) 提交于 2019-11-30 09:29:52
基本思想:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。​根据需求,如果你想要结果从小到大排列,它会首先将数组进行分组,然后将较小值移到前面,较大值移到后面,最后将整个数组进行插入排序,这样比起一开始就用插入排序减少了数据交换和移动的次数,可以说希尔排序是加强 版的插入排序 拿数组5, 2,8, 9, 1, 3,4来说,数组长度为7,当increment为3时,数组分为两个序列5,2,8和9,1,3,4,第一次排序,9和5比较,1和2比较,3和8比较,4和比其下标值小increment的数组值相比较此例子是按照从小到大排列,所以小的会排在前面,第一次排序后数组为5, 1, 3, 4, 2, 8,9第一次后increment的值变为3/2=1,此时对数组进行插入排序, 实现数组从大到小排。 Java实现: public class ShellSort { public static void shellSort(int []numbers) { int temp=0; int j=0; //每次将步长缩短为原来的一半 for(int increment=numbers.length/2;increment>0;increment/=2) { for(int i=increment;i<numbers

数据结构排序算法摘要

一个人想着一个人 提交于 2019-11-30 08:42:21
这里是引用 1.插入排序: (1).直接插入排序:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的序列 (2).折半插入排序:在将一个元素插入已排好序的数组的过程中,寻找插入点,将待插入区域的首元素设为a[low],末元素设为a[high],则轮比较时将待插入元素与a[mid]相比较,其中mid=(low+high)/2,如果比a[mid] 小,则选择a[low]到a mid-1 为新的插入区域,否则选择a mid+1 到a[high]为新的插入区域,直到low<=high不成立,即将此位置(包括low)之后所有元素后移一位,并将新元素插入a[low] (折半插入排序是对直接插入排序的一种改进,减少了比较次数) (3).二路插入排序:另设一个和待排数组arr同类型的数组brr,首先将arr[1]赋值给brr[1],并将brr[1]看成 是在排好序的序列中处于中间位置的记录,然后从arr中第二个记录开始依次插入到brr[1]之前或之后的有序序列 中。先将待插记录的关键字和brr[1]的关键字进行比较,若arr[i].key<brr[1].key,则将arr[i]插入到brr[1]之前的有序表中。反之,则将arr[i]插入到brr[1]之后的有序表中。在实现算法时,可将brr看成一个循环变量(数组首尾循环)