排序——2.插入排序

插入排序

1.想象桌子上有一堆扑克牌,左手中只有一张,数值是2,然后从桌子上拿起一张,数值是5,将这张扑克牌的和左手上的扑克牌进行比较,把较小的哪一个放到左边,于是左手上的扑克牌变成两张,排列从左到右分别是:2,5。

2.然后再从桌子上拿起一张牌3,此时左手上已经有两张牌并且已经排好顺序,左边的小右边的大。然后我们把刚刚拿起的第三张牌和左手上的扑克牌进行比较,从左开始,那么就是先和2比较,3>2,于是再和下一个比较,3<5,那么就把5往后移动,在2和5之间留出一个空格来放置3,停止比较,去桌子上抓下一张牌。

3.重复上一步,直到桌子上再也没有扑克牌。

假设有数组a[10]={8,4,6,3,2,1,8,5,11,25},我们把a[0]当成左手上的第一张牌,a[1]-a[9]当成是桌子上的那一堆牌:

然后开始执行插入排序,将4与8相比较,4<8 然后将8向右移动:

再把4放置到空位上:

这样就做好了第一轮排序,再执行下一轮:

6先与4比较,6>4,不满足条件再和下一个比较,8>6,满足条件,于是将8向右移动,这样就又出现一个空位:

把6填进去:

以此类推,直到所有元素都排序完成。

代码:

class Program
    {
        static void Main(string[] args)
        {
            int[] a = new int[] { 8, 4, 6, 3, 2, 1, 8, 5, 11, 25 };
            Console.WriteLine("未排序之前的顺序:");
            foreach (int s in a)
            { Console.WriteLine("    {0}",s); }
            int j, k;
            for (int i=1;i<a.Length;i++)
            {
                for (j=0; j<i; j++)
                {
                    if (a[i]<a[j])
                    break;
                }
                int temp = a[i];
                for (k=i; k>j;k--)
                {
                    a[k] = a[k-1];
                }
                a[j] = temp;
            }
            Console.WriteLine("排序之后的顺序:");
            foreach (int s in a)
            { Console.WriteLine("    {0}", s); }
            Console.ReadKey();
        }
    }

运行结果:

时间: 2024-09-23 00:52:49

排序——2.插入排序的相关文章

C#的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序

插入|排序|算法 本文介绍了C#的四种排序算法:冒泡排序.选择排序.插入排序和希尔排序 冒泡排序 using System: namespace BubbleSorter { public class BubbleSorter { public void Sort(int [] list) { int i,j,temp: bool done=false: j=1: while((j<list.Length)&&(!done)) { done=true: for(i=0:i<li

经典算法:选择排序、插入排序和气泡排序的实现

将要排序的对象分作两部分,一个是一排序的,一个是未排序的,从后面未排序部分选择一个最小 值,并放入前面已排序部分的最后一个.例如: 排序前:70 80 31 37 10 1 48 60 33 80 [1] 80 31 37 10 70 48 60 33 80 选出最小值1 [1 10] 31 37 80 70 48 60 33 80 选出最小值10 [1 10 31] 37 80 70 48 60 33 80 选出最小值31 [1 10 31 33] 80 70 48 60 37 80 ....

内部排序——希尔插入排序

直接插入排序在时间复杂度上优势不明显.达到O(n2)的水平了,所以需要想办法降低时间复杂度是很有必要的.当记录的排序就是所求的排序时,时间复杂度会大幅下降,为O(n).这是最理想的状态,当顺序刚好是逆序的时候,时间复杂度最大为O(n2).所以记录越是有序,时间复杂度越低.这个和快速排序不同,大家都知道快速排序在有序的情况下效果是很差的吧. 现在的问题是,如何使得记录变得有序,这个也是我们求的最后结果.希尔排序是一种很好的选择,它的原理是使得记录大体上有序,虽然不是所有都有序,但是大体上有序也是很

Java实现的各种排序算法(插入排序、选择排序算法、冒泡排序算法)_java

一.插入排序算法实现java版本 public static int[] insert_sort(int[] a) { for (int i = 0; i < a.length; i++) { for(int j=i+1;j>0&&j<a.length;j--) { if(a[j]<a[j-1]) { int tmp = a[j]; //这样定义初始化逻辑上是可以的,j变量,每次tmp的值变化的 a[j] = a[j-1]; a[j-1] = tmp; } } }

内部排序:插入排序和希尔排序的N种实现

前言 本来想将所有的内部排序总结为一篇博文,但是随着研究的深入,还是放弃了这个念头,斟前酌后,还是觉得分开来写比较好,具体原因,看完本篇博文也就自然明了了. 本篇文章主要探讨插入排序和希尔排序,之所将二者放在一起,很明显,是因为希尔排序是建立在插入排序的基础之上的. 注:以下各排序算法的N种实现方法大部分都是我根据算法思想,自己写出来的,或者是参考其本身的经典实现,我自己都已测试通过,但不敢保证一定都没问题,如果有疑问,欢迎指出. 插入排序 插入排序的思想很简单,它的基本操作就是将一个数据插入到

php中实现冒泡排序、快速排序、选择排序和插入排序等经典算法

// 冒泡排序 function BubbleSort($arr) { // 获得数组总长度 $num = count($arr); // 正向遍历数组 for ($i = 1; $i < $num; $i++) { // 反向遍历 for ($j = $num - 1; $j >= $i ; $j--) { // 相邻两个数比较 if ($arr[$j] < $arr[$j-1]) { // 暂存较小的数 $iTemp = $arr[$j-1]; // 把较大的放前面 $arr[$j-

算法速成(三)七大经典排序之直接插入排序、希尔排序和归并排序

直接插入排序: 这种排序其实蛮好理解的,很现实的例子就是俺们斗地主,当我们抓到一 手乱牌时,我们就要按照大小梳理扑克,30秒后, 扑克梳理完毕,4条3,5条s,哇塞......  回忆一下,俺们当时是怎么梳理的. 最左一张牌是3,第二张牌是5,第三张牌又是3, 赶紧插到第一张牌后面去,第四张牌又是3,大喜,赶紧插到第二张后面去, 第五张牌又是3, 狂喜,哈哈,一门炮就这样产生了. 怎么样,生活中处处都是算法,早已经融入我们的生活和 血液. 下面就上图说明: 看这张图不知道大家可否理解了,在插入排

排序算法之一插入排序(直接插入和希尔排序)

本文的图均引用自http://blog.csdn.net/pzhtpf/article/details/7559896,代码为结合众家思想以及自己的方式而来. 下面是一些排序的关系图: 直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2]个数是排好序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好序的.如此反复循环,知道全部排好顺序.(2)实例: (3)代码实现: 123456789101112131415161718192021222324 /** *

常见的五类排序算法图解和实现(插入类:直接插入排序,折半插入排序,希尔排序)

基本的五类排序算法(插入,选择,交换,归并,基数排序).排序:将数据元素的一个任意序列,重新排列成一个按关键字有序的序列. 排序的稳定性:待排序列中有大于等于2个相同的项,且排序前后,相同项的相对位置是否发生了变化(如果变化了就是不稳定的排序,不变化就是稳定的) 内部排序:若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序:(待排序列全部放入内存) 插入累排序:(直接插入,折半插入,希尔排序) 直接插入排序: 先将序列中第 1 个记录看成是一个有序子序列, 然后从第 2 个记录开始