【Data_Structure笔记3】排序算法之插入排序常见的三种算法
来源:互联网 发布:java输出倒三角 编辑:程序博客网 时间:2024/06/05 04:36
/************************************************************************************************************************文件说明: 【1】内部排序:是指在排序期间元素全部存放在内存中的排序【2】外部排序:是指在排序期间元素无法全部同时存放在内存中,必须在排序的过程中根据要求,不断的在内、外存之间移动的 排序【3】排序算法的稳定性【4】内部排序算法的性能取决于算法的【时间复杂度】和【空间复杂度】,而时间复杂度一般是由【比较】和【移动】的次数来 决定的详细说明: 【1】插入排序算法 (1)直接插入排序(2)折半插入排序(3)希尔排序(shell sort)【2】交换类排序 (1)冒泡排序(2)快速排序【3】选择类排序 (1)简单选择排序(2)堆排序【4】二路归并排序【5】基数排序插入排序: 【1】插入排序是一种简单直观的排序算法,其基本思想在于每次将一个待排序的记录,按其关键字大小插入到前面已经排好的子 序列中,直到全部记录插入完成。【2】由插入排序的算法思想可以扩展出三个具体的排序算法: (1)直接插入排序(2)折半插入排序(3)希尔排序*************************************************************************************************************************/#include<iostream>using namespace std;/************************************************************************************************************************函数原型: 【函数模板】template<typename ElemType>void InsertSort(ElemType arrayT[],int iLength)【适用性】【直接插入排序算法】适用于【顺序存储】和【链式存储】的线性表。并且一般适用于记录数较少且基本有序的线性表函数说明: 【1】对记录数组arrayT做直接插入排序【2】iLength为数组中待排序记录的数目直接插入排序算法: 【1】从空间角度来看,直接插入排序算法只需要设置监视哨兵tempT来帮助实现即可。【2】从时间角度来看,主要的时间耗费在关键字比较和元素的移动操作上。【3】【直接插入排序算法】并不是任意使用的,它比较适用于待排序记录数目较少且基本有序的情形 (1)记录数目较少 (2)基本有序【4】直接插入排序使用【就地排序】*************************************************************************************************************************/template<typename ElemType>void InsertSort(ElemType arrayT[],int iLength){ElemType tempT; //【1】定义一个监视哨兵int j = 0;for(int i=1;i<iLength;i++){tempT = arrayT[i];j = i-1;while (tempT<arrayT[j]){arrayT[j+1] = arrayT[j];j = j-1;}arrayT[j+1] = tempT;} }/************************************************************************************************************************函数原型: 函数模板:template<typename ElemType>void BinSort(ElemType arrayT[],int iLength)函数说明: 【1】对记录数组arrayT做【折半插入排序】【2】iLength为数组中待排序记录的数目算法思想: 【1】从查找算法的讨论中可知,对于【有序的顺序表】进行折半查找,其性能优于顺序查找。所以,可以将【折半查找】的思想 应用于在有序的记录中确定插入的位置,相应的排序算法称为【折半插入排序算法】【2】采用折半插入排序算法,【3】采用折半插入排序算法,可以减少关键字的比较次数。没插入一个元素,需要比较的次数最大为折半判定树的深度*************************************************************************************************************************/template<typename ElemType>void BinSort(ElemType arrayT[],int iLength){ElemType tempT;int j = 0;int iLow = 0;int iHigh= 0;int iMid = 0;for(int i=1;i<iLength;i++){tempT = arrayT[i];iLow = 0;iHigh = i-1;while (iLow<=iHigh){iMid = (iLow+iHigh)/2;if(tempT<arrayT[iMid]){iHigh = iMid-1;}else{iLow = iMid+1;}}//whilefor(j = i-1;j>=iLow;j--){arrayT[j+1] = arrayT[j];}arrayT[iLow] = tempT;}//for i}/************************************************************************************************************************函数原型: 【函数模板】template<typename ElemType>void BinSort(ElemType arrayT[],int iLength)【适用性】希尔排序算法仅适用于当线性表为【顺序存储】的情况函数说明: 【1】对记录数组arrayT做【折半插入排序】【2】iLength为数组中待排序记录的数目希尔排序: 【1】从前面的讲解,不难看出,【直接插入排序算法】适用于【基本有序的排序表】和【数据量不大的排序表】。【2】基于这两点。1959年D.L.Shell提出了希尔排序,又称为"缩小增量排序"。希尔排序的思想: 【1】先将【待排序表】分割成若干个形如L[i,i+d,i+2d,i+3d,........i+kd]的特殊子表。【2】分别直接进行【插入排序】【3】当整个表中元素已呈"基本有序"时,再对全体记录进行一次【直接插入排序】算法性能: 【1】【适用性】:希尔排序算法仅适用于当线性表为【顺序存储】的情况。【2】希尔排序算法的时间复杂度一般认为O(nlogn),在最坏情况下为O(n*n)*************************************************************************************************************************/template<typename ElemType>void ShellInsertSort(ElemType arrayT[],int iLength){for(int d=iLength/2;d>=1;d=d/2) //【1】设置(起始增量;循环条件;艘小增量的规则){for(int k=0;k<d;k++) //【2】增量为N,就有N个子序列,遍历所有的子序列{//===========================================================================================================for(int i=k+d;i<iLength;i+=d) //【3】对每个子序列进行【插入排序】{int iTemp = arrayT[i];int j = i -d;while (j>=k&&iTemp<arrayT[j]){arrayT[j+d]=arrayT[j];j = j-d;}arrayT[j+d] = iTemp;}//i//=============================================================================================================}//for k}}int main(int argc,char* argv[]){int arrayT[15] = {22,32,44,34,56,21,24,345,213,234,245,127,113,119,933};//InsertSort<int>(arrayT,15); //BinSort<int>(arrayT,15);ShellInsertSort<int>(arrayT,15);for(int i=0;i<15;i++){std::cout<<arrayT[i]<<std::endl;}std::system("pause");return 0;}
阅读全文
0 0
- 【Data_Structure笔记3】排序算法之插入排序常见的三种算法
- 【Data_Structure笔记8】排序算法之【选择排序---堆排序】
- 【Data_Structure笔记4】排序算法之【交换类排序】
- 【Data_Structure笔记5】排序算法之【选择类排序】
- 【Data_Structure笔记6】排序算法之【二路归并排序】
- 【Data_Structure笔记7】排序算法之【链式基数排序】
- 【Data_Structure笔记14】【笔试】之【所有排序算法】
- Java三种常见的排序算法:冒泡,选择,插入
- 常见排序算法之直接插入排序
- 常见排序算法之插入排序
- 常见排序算法(插入排序-曾经的笔记)
- 排序并插入/常见的排序算法
- 排序算法(三)之插入排序
- 排序算法之三 插入排序
- 蛙步学排序算法之三 - 插入排序
- 【算法-排序之三】插入排序
- 【算法-排序之三】插入排序
- 【算法-排序之三】插入排序
- 理解c语言中的constant*() &p()[] *p[56]的语法的难点 const
- sikuli实现百度云批量离线下载
- 对Java代理模式的理解
- scrapy创建爬虫项目
- 【学生】优化-数据库为空处理
- 【Data_Structure笔记3】排序算法之插入排序常见的三种算法
- Python 生成器
- stm32 FSMC-外扩SRAM IS62WV51216
- Python 正确重载运算符
- 【盘点】9月值得参加的大数据大会相关会议
- c/c++易错知识点3(引用和指针)(二)
- SQL 语句的使用
- JVM原理
- hdu-3249-Girls' research -mancher