排序系列算法——插入排序

1. 原理

插入排序是顾名思义是将未进行排序的元素不断插入到已排序序列中的排序方法。如下图所示:

插入排序说白点就是在以排序的序列中找到未排序元素的位置,并将元素插入行程新的已排序序列的过程。

2.排序过程及算法设计

排序过程

以一个实际的例子为例:

设有序列{7,9,6,12,15,11},使用插入排序对上述的序列按从小到大进行排序,排序的过程可描述如下:

算法设计

插入排序是将元素插入已排序序列的过程,排序过程需要将元素与已排序的序列元素进行对比,采用从后往前的对比顺序,不断向前移动,直到不能向前移动为止,此时当前的位置就是要插入元素所属的位置。如对元素6进行插入排序,排序的过程如下图所示:

其余所有元素的排序过程与上述过程类似。

3. C++源码

 1 #include "stdafx.h"
 2
 3 #include <iostream>
 4
 5 using namespace std;
 6
 7 void insection_Sort(int *values,int length){
 8
 9     for(int i=0;i<length;i++){
10
11         int currentValue = *(values+i);     //currentValue表示要插入元素的值
12
13         int index=i-1;                                //index表示要与插入元素currentValue对比的元素的下标
14
15         while(currentValue<*(values+index)&&index>=0){
16
17            *(values+index+1)=*(values+index);        //若当前位置的元素比插入元素要大,将当前元素向后移一位
18
19             index--;
20
21         }
22
23         *(values+index+1)=currentValue;        //此时index表示插入元素的下表,对该位置复制currentValue
24
25     }
26
27 }
时间: 2024-10-13 21:28:58

排序系列算法——插入排序的相关文章

排序系列算法——堆排序

堆:大根堆与小根堆 堆排序是建立在堆基础上的排序方法,首先了解一下什么是堆. 常用的堆一般有两种,大根堆和小根堆.堆可以看做是一棵二叉树,其父节点的值总是大于(大根堆)或者小于(小根堆)子节点的值.举一个例子: 图1 不满足堆的条件                 图2大根堆                             图3 小根堆 图1不是堆,因为不满足父节点的值大于或者小于子节点的值: 图2是大根堆,根节点是最大值,父节点都大于或等于子节点的值: 图3是小根堆,根节点是最小值,父

排序系列算法——冒泡排序

冒泡排序 什么是冒泡排序 如果大家平常有即系观察水泡付出谁面的情况就可以发现水泡从下往上是逐渐增大的,升到即将浮出水面的时候往往是水泡最大的时候,如下图所示. 冒泡排序的原理跟这个情况很类似,让子序列中的最大元素不断沉底,达到排序的目的.说白了,冒泡排序一共经过N-1次遍历,其中第i次遍历前N-i个元素(第i+1到N个元素已经排序完毕),将第i大的元素移动到N-i的位置 . 冒泡排序的过程可描述如下: 令A表示进行排序的数组,N表示A的长度,A[i]表示数组A第i+1个元素,i=1,1,2,3.

排序算法系列之插入排序 (1)

排序,即是以一定的规则组织数据,排序算法的优劣关键在于比较数据的交换和移动次数. 排序算法需要考虑的几点:数据交换次数,移动次数,数据越界,算法的实用性(符合多种类型) //预知:使用C#拓展方法进行数据输出,使用StringBuilder节约内存开销 public static class DebugExtension { public static void DebugArray<T>(T[] array) { StringBuilder sb = new StringBuilder(ar

排序算法系列——直接插入排序

直接插入排序与希尔排序一起属于插入排序的一种.插入适合于针对小数据量进行排序,当数据量很大时插入排序的效率相对其他排序会较低,因为他的时间复杂度是0(n2)(下面会进行分析). 基本思想:一组待排序的数据,首先将其划分成两部分,一部分是已排好序的,另一部分是待排序的,然后依次从待排序部分取出一个数插入到已排序部分的适当位置,保证第一部分始终是已排好序的,等待排序部分全部取出放入已排序部分之后整个排序过程就完成了. 实现要点:首先取一个关键点,将关键点前面部分作为已排好序部分,关键点后面部分作为待

排序系列之——冒泡排序、插入排序、选择排序

排序之——冒泡排序: 基本思想:假设待排序表长为N,从后往前(或者从前往后)两两比较相邻元素的值,若为逆序(arr[i-1]>arr[i]),则交换他们,直到序列比较完.这时一趟冒泡. 代码如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <time.h> 5 #define N 20 6 7 void print_Arr(int *arr,

数据结构之排序算法Java实现(6)—— 插入类排序之折半插入排序算法

折半插入排序是对直接插入排序进行了改进,在寻找插入点时使用二分查找算法,提高了查询效率. 升序排序: /** * 折半插入排序 * 升序排序 */ @Override public <T extends Comparable<? super T>> void sortByAsc(T[] data) { for(int i = 1;i < data.length;i++ ){ if(data[i].compareTo(data[i - 1]) < 0){ /**记录i的值

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

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

排序算法学习之简单排序(冒泡排序,简单选择排序,直接插入排序)

一.冒泡排序 冒泡排序算是最基础的一种算法了,复杂度为O(N^2),其基本思想是:从最低端数据开始,两两相邻比较,如果反序则交换.代码如下: /*最基本的冒泡排序*/ void BubbleSort1 (int n, int *array) /*little > big*/ { int i, j; for (i=0; i<n-1; i++) { for (j=n-1; j>i; j--) { if (array[j] < array[j-1]) { int temp = array

图文并茂排序与算法

图文并茂排序与算法总结 转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5094764.html 总结下常用的排序算法,方便以后查阅. 常见排序算法:冒泡排序.选择排序.插入排序.壳(shell)排序.合并排序.快速排序.堆排序. 要选择合适的算法,需考虑的因素:执行时间.存储空间和编程工作. 1.选择排序 具有二次方程增长阶,近适用于小列表排序. 通过列表反复扫描,每次扫描选择一项,然后将这一项移动到列表中正确的位置. 选择排序总比较次数=(n-1)+(