查找与排序04,插入排序

在选择排序中,从第一个元素开始,依次遍历数组中的元素,找出当前遍历元素之后的最小元素,与当前遍历元素交换位置,依此类推,是一种由前往后的排序。而在插入排序中,从第二个元素开始,依次遍历数组中的元素,把当前遍历元素与之前的元素进行比较,并插入到之前的某个位置,是一种由后往前的排序。

自定义一个类,里面维护着一个int[]类型数组,通过构造函数定义数组长度并初始化,并提供了打印和插入排序的相关方法。

    public class MyArray
    {
        private static int[] arr;
        private static Random r = new Random();

        public MyArray(int size)
        {
            arr = new int[size];
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = r.Next(10, 100);
            }
        }

        //插入排序
        public void Sort()
        {
            int insert;
            for (int i = 1; i < arr.Length; i++) //从第二个元素开始遍历
            {
                insert = arr[i];//把当前遍历元素视为插入元素,放到临时变量insert中
                int moveItem = i;//movieItem可以理解为一个动态索引,初始位置在当前遍历元素的索引
                while (moveItem > 0 && arr[moveItem -1] > insert) //如果前面一个元素比插入元素大
                {
                    arr[moveItem] = arr[moveItem - 1];//那就把前面这个元素赋值给后面位置,相当于往后移一位
                    moveItem--;//再把动态索引位置向前移动一位
                }

                arr[moveItem] = insert;
                Print();
            }
        }

        //打印数组元素
        public void Print()
        {
            foreach (var item in arr)
            {
                Console.Write(item + " ");
            }
            Console.WriteLine();
        }
    }


以上,大致过程是:从数组中第二个元素开始,先把当前遍历元素赋值给一个临时变量,比如说是insert,insert这个变量肯定要插入到当前遍历元素之前的某个位置,如何确定插入位置呢?假设用moveItem变量表示最终要插入的索引位置,先把当前遍历元素的索引赋值给moveItem,如果moveItem-1位置上的元素大于insert,那就把moveItem-1位置上的元素向后移动一位,并把moveItem-1位置的索引赋值给moveItem,insert是要插入到当前的这个moveItem位置吗?不一定。再继续拿当前moveItem位置的前面一个位置上的元素与insert比较,只要是比insert大,就把该位置上的元素向后移动一位,并重新设置moveItem的值,直到停止循环。此时moveItem的值就是insert需要插入的位置。

客户端调用。

    class Program
    {
        static void Main(string[] args)
        {
            MyArray myArray = new MyArray(8);
            Console.WriteLine("排序前:");
            myArray.Print();

            Console.WriteLine("排序后:");
            myArray.Sort();
            Console.ReadKey();
        }
    }

对于插入排序,当依次遍历数组元素时,进行了n-1次迭代,当把第二个元素插入到之前某个位置时进行了1次迭代,当把第三个元素插入到之前某个位置时进行了2次迭代......第n个元素进行了n-1次迭代,以时间复杂度来说,忽略小项和常数项,插入排序基本上是一个平方阶,写成O(n2)。

“查找与排序”系列包括:

查找与排序01,线性查找,时间复杂度,算法

查找与排序02,折半查找

查找与排序03,选择排序

查找与排序04,插入排序

查找与排序04,插入排序

时间: 2024-10-12 05:10:58

查找与排序04,插入排序的相关文章

查找与排序05,冒泡排序

在体验了"选择排序"和"插入排序",本篇体验的是"冒泡排序",依次遍历数组中的元素,按照升序排列,如果前一个位置元素比后一个位置元素大,两者就交换位置. 自定义一个处理整型数组的类,包含添加.显示.清除及冒泡方法以及获取数组长度的属性. class MyIntArray { private int[] arr; private int upper; //最大索引 private int index; //当前索引 public MyIntArra

希尔排序(插入排序)-八大排序三大查找汇总(5)

基本思想 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序. 稳定性 由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的. 时间复杂度 希尔排序的时间复杂度取决于步长的选择. 平均情况下,

关于查找与排序

查找和排序都是程序中经常用到的算法 查找分为:顺序查找,二分查找.哈希表查找和二叉树排序查找. 哈希表和二叉树查找的重点在于其数据结构.哈希表的主要优点是能够在O(1)的时间查找某一元素,是效率最高的查找方式.其缺点是需要额外的空间来实现哈希表. 排序分为插入排序,冒泡排序,递归排序,快速排序等.排序的这几种方法的优劣(额外空间的消耗,平均时间复杂度和最差时间复杂度).特点是重点. 快速排序 快速排序关键在于先在数组中选择一个数字,接下来吧数组中的数字分为两部分,比选择数组小的放到左边,大的放到

经典排序算法 – 插入排序Insertion sort

经典排序算法 – 插入排序Insertion sort  插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种,这里只介绍直接插入排序,折半插入排序留到“查找”内容中进行.   图1演示了对4个元素进行直接插入排序的过程,共需要(a),(b),(c)三次插入. 以下代码仅供参考,欢迎指正 /// <summary> /// 插入排序 /// </summary> /// <param na

数据结构之查找与排序

查找 静态查找:查找时,只查找读取 顺序表上查找 无序表上查找,设置位置0为岗哨,从后往前查找,查找长度为(n+1)/2 有序表上查找,使用二分查找,平均查找长度为 log2(n+1)-1 索引顺序表上查找,索引表将顺序表分别分割为若干块,顺序表按块有序,查找长度为 (n/s+s)/2+1 动态查找 二叉排序树:或为空树或具有下列性质: 1.若左子树不为空,则左子树上的所有结点的键值均小于它的根结点的键值, 2.若右子树不为空,则右子树上的所有结点的键值均小于它的根结点的键值, 3.根的左子树,

Java排序算法分析与实现:快排、冒泡排序、选择排序、插入排序、归并排序(二)

一.概述: 上篇博客介绍了常见简单算法:冒泡排序.选择排序和插入排序.本文介绍高级排序算法:快速排序和归并排序.在开始介绍算法之前,首先介绍高级算法所需要的基础知识:划分.递归,并顺带介绍二分查找算法. 二.划分: 划分是快速排序的前提,即把数据分为两组,大于特定值的数据在一组,小于特定值的数据在另一组.快速排序即是由划分和递归操作来完成的. (1)原理: 定义一个阈值,分别从最左面和最右面向中间遍历元素,左面找到一个大于阈值的数据便停止,右边找到一个小于阈值的数据便停止,如果此时左右两边都还没

查找与排序算法(Searching adn Sorting)

1,查找算法 常用的查找算法包括顺序查找,二分查找和哈希查找. 1.1 顺序查找(Sequential search) 顺序查找: 依次遍历列表中每一个元素,查看是否为目标元素.python实现代码如下: #无序列表 def sequentialSearch(alist,item): found = False pos=0 while not found and pos<len(alist): if alist[pos]==item: found=True else: pos = pos+1 r

查找和排序的基本操作:查找排序算法大集合

重点 查找算法着重掌握:顺序查找.二分查找.哈希表查找.二叉排序树查找. 排序算法着重掌握:冒泡排序.插入排序.归并排序.快速排序. 顺序查找 算法说明 顺序查找适合于存储结构为顺序存储或链接存储的线性表. 算法思想 顺序查找也称为线形查找,属于无序查找算法.从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功:若扫描结束仍没有找到关键字等于k的结点,表示查找失败. 算法实现 int sequenceSearch(int a[], int valu

C++ 中对vector&lt;T*&gt; 数组的查找和排序

//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include <vector> #include <algorithm> using namespace std; //-----------------------------------