经典排序之 插入排序

简介: Author: bakari  Date: 2012.7.21 排序算法有很多种,每一种在不同的情况下都占有一席之地。关于排序算法我分“经典排序之”系列分别述之。本篇为插入排序。 插入排序有三种形式: 转载引用请注明出处:http://www.

Author: bakari  Date: 2012.7.21

排序算法有很多种,每一种在不同的情况下都占有一席之地。关于排序算法我分“经典排序之”系列分别述之。本篇为插入排序。

插入排序有三种形式:

转载引用请注明出处:http://www.cnblogs.com/bakari/archive/2012/08/11/2633636.html  谢谢!

一、最简单的直接插入排序,每个元素之间选取的间隔为1

见代码:

 1 /*****************************************************
 2  *     Author: bakari Date: 2012.7.21
 3  *     直接插入排序
 4  *     存储结构--vector
 5  *****************************************************/  
 6 void InsertSort::Insort()
 7 {
 8     for(int i = 1; i != len; ++i)
 9     {
10         int InsertPoint = insertList[i];
11         int iReplace = i;
12         while(iReplace > 0 && InsertPoint < insertList[iReplace - 1])
13         {
14             insertList[iReplace] = insertList[iReplace - 1];  //移动填补
15             iReplace --;
16         }
17         insertList[iReplace] = InsertPoint;         //插入
18     }
19 }

 

二 、shell排序:

shell排序其实本质是插入排序,只不过是分区间,然后在不同的区间去进行排序。

看代码:

 1 /***********************************************
 2  *  shell排序
 3  *  在直接插入排序的基础上增加间隔
 4  *  算法和直接插入一致
 5  ***********************************************/
 6 void ShellSort::Shell_Sort()
 7 {
 8     int gap = len / 2;   //确定间隔,初始间隔为序列长度的一半,而后继续缩小进行
 9     while(gap)
10     {
11         for (int i = gap;i < len; i += gap)
12         {
13             int ShellPoint = ShellList[i];
14             int j = i;
15             while(j > 0 && ShellPoint < ShellList[j - gap])
16             {
17                 ShellList[j] = ShellList[j - gap];
18                 j -= gap;
19             }
20             ShellList[j] = ShellPoint;
21         }
22         gap /= 2;         //继续缩小间隔,直到间隔为1;
23     }
24 }

 

三、二叉插入排序

这个和二叉查找类似,找不到元素之后就进行插入,直到排序完为止。

看代码:

 1 /****************************************************
 2  *  二叉插入排序
 3  *  原理与二叉查找相似,找不到元素则进行插入
 4  ****************************************************/
 5 
 6 //插入排序实现
 7 void BinaryInsertSort::Binary_Insert_Sort()
 8 {
 9     int mid;      //记录中点位置
10     for (int i = 0; i != len; ++i)
11     {
12         int BInsertPoint = BInsertList[i];
13         int left = 0;
14         int right = i - 1;
15         while(left <= right)
16         {
17             mid = (left + right) / 2;
18             if(BInsertPoint < BInsertList[mid])
19                 right = mid - 1;
20             else left = mid + 1;
21         }
22         for(int j = i; j > left ;j--)
23             BInsertList[j] = BInsertList[j - 1];
24         BInsertList[left] = BInsertPoint;
25     }
26 }
目录
相关文章
【经典排序】插入与希尔排序
【经典排序】插入与希尔排序
69 0
|
算法 API
算法排序4——插入排序
每个元素要比较的是它之前的已排序的元素,并判断大小,所以再定义一个元素 j,从已排序组内从后往前比较;例如当 i = 5 的时候,其实是第6个位置,而 j = 5 的时候,由于从第一个开始计数,所以就表示第五个位置,恰好满足已排序组内的最后一个,终止值就是元素第一个
94 0
算法排序4——插入排序
|
搜索推荐 算法 Java
排序:冒泡排序(算法)
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。
273 0
排序:冒泡排序(算法)
|
算法 搜索推荐 Java
排序:插入排序(算法)
排序:插入排序(算法)
210 0
排序:插入排序(算法)
|
算法 JavaScript 人工智能
|
机器学习/深度学习 人工智能
|
机器学习/深度学习 人工智能