插入排序-----自理解(详细注释)
2014-10-12 16:03
295 查看
抽点时间复习下基本的算法,以备不时只需
/******************************************************** *函数名称:InsertSort *参数说明:a 无序数组; * length 数组长度 *说明: 插入排序,从后向前移动实现 *********************************************************/ void InsertSort(int *a,int length) { int i,j;//循环变量 for(i=1;i<length;i++)//从第2个数据开始插入 { int temp=a[i];//记录要插入的数据 for(j=i-1;j>=0&&a[j]>temp;j--) //从后向前,找到比其小的数的位置,注意是j>=0; { a[j+1]=a[j]; //向后挪动 } a[j+1]=temp;//1、如果找到了比temp小的则将temp放在比它小的后面,2、如果没找到比他小的,也就是它最小这时候的j=-1,所以放在了a[j+1]数组第一个那里 } } /******************************************************** *函数名称:FindElem *参数说明:a 无序数组; * num 查找的无序数组元素个数 * data 查找的元素 *说明: 二分查找,查找到插入data的合适位置 *********************************************************/ int FindElem(int *a,int num,int data) { int start=0;//起始位置索引 int end=num-1;//结束位置索引 int index=-1;//默认查找到的位置索引 while(start<=end) { index=(start+end)/2;//折半 if(a[index]>data) { end=index-1; } else { start=index+1; } } if(a[index]<=data)//如果此时的index对应的元素小于或者等于data,则位置找到 index++;//得到插入位置 return index;//返回插入位置 } /******************************************************** *函数名称:FindElem *参数说明:a 无序数组; * num 无序数组长度 *说明: 插入排序,通过二分法查找确定插入位置实现。 *********************************************************/ void InserSort2(int *a,int num) { int i,j,index;//定义循环变量和插入位置的索引 for(i=1;i<num;i++) { index=FindElem(a,i,a[i]);//调用二分查找函数,获得插入位置,每一次外循环确定无序数组前i+1个元素是有序的。 if(i!=index) { int temp=a[i];//获得插入元素 /*//同样可以通过段代码实现,其中区别,主要是j>index和j>=index //处理好移动的位置和插入位置的关系 for(j=i;j>index;j--) { a[j]=a[j-1]; } a[index]=temp;//a[j]=temp同样正确,因为在退出for循环后,j就已经等于index了。 */ for(j=i-1;j>=index;j--) { a[j+1]=a[j]; } a[index]=temp;//插入元素到指定位置 } } }
/******************************************************** *函数名称:InsertSort *参数说明:a 无序数组; * length 数组长度 *说明: 插入排序,从后向前移动实现 *********************************************************/ void InsertSort(int *a,int length) { int i,j;//循环变量 for(i=1;i<length;i++)//从第2个数据开始插入 { int temp=a[i];//记录要插入的数据 for(j=i-1;j>=0&&a[j]>temp;j--) //从后向前,找到比其小的数的位置,注意是j>=0; { a[j+1]=a[j]; //向后挪动 } a[j+1]=temp;//1、如果找到了比temp小的则将temp放在比它小的后面,2、如果没找到比他小的,也就是它最小这时候的j=-1,所以放在了a[j+1]数组第一个那里 } } /******************************************************** *函数名称:FindElem *参数说明:a 无序数组; * num 查找的无序数组元素个数 * data 查找的元素 *说明: 二分查找,查找到插入data的合适位置 *********************************************************/ int FindElem(int *a,int num,int data) { int start=0;//起始位置索引 int end=num-1;//结束位置索引 int index=-1;//默认查找到的位置索引 while(start<=end) { index=(start+end)/2;//折半 if(a[index]>data) { end=index-1; } else { start=index+1; } } if(a[index]<=data)//如果此时的index对应的元素小于或者等于data,则位置找到 index++;//得到插入位置 return index;//返回插入位置 } /******************************************************** *函数名称:FindElem *参数说明:a 无序数组; * num 无序数组长度 *说明: 插入排序,通过二分法查找确定插入位置实现。 *********************************************************/ void InserSort2(int *a,int num) { int i,j,index;//定义循环变量和插入位置的索引 for(i=1;i<num;i++) { index=FindElem(a,i,a[i]);//调用二分查找函数,获得插入位置,每一次外循环确定无序数组前i+1个元素是有序的。 if(i!=index) { int temp=a[i];//获得插入元素 /*//同样可以通过段代码实现,其中区别,主要是j>index和j>=index //处理好移动的位置和插入位置的关系 for(j=i;j>index;j--) { a[j]=a[j-1]; } a[index]=temp;//a[j]=temp同样正确,因为在退出for循环后,j就已经等于index了。 */ for(j=i-1;j>=index;j--) { a[j+1]=a[j]; } a[index]=temp;//插入元素到指定位置 } } }
/******************************************************** *函数名称:InsertSort *参数说明:a 无序数组; * length 数组长度 *说明: 插入排序,从后向前移动实现 *********************************************************/ void InsertSort(int *a,int length) { int i,j;//循环变量 for(i=1;i<length;i++)//从第2个数据开始插入 { int temp=a[i];//记录要插入的数据 for(j=i-1;j>=0&&a[j]>temp;j--) //从后向前,找到比其小的数的位置,注意是j>=0; { a[j+1]=a[j]; //向后挪动 } a[j+1]=temp;//1、如果找到了比temp小的则将temp放在比它小的后面,2、如果没找到比他小的,也就是它最小这时候的j=-1,所以放在了a[j+1]数组第一个那里 } } /******************************************************** *函数名称:FindElem *参数说明:a 无序数组; * num 查找的无序数组元素个数 * data 查找的元素 *说明: 二分查找,查找到插入data的合适位置 *********************************************************/ int FindElem(int *a,int num,int data) { int start=0;//起始位置索引 int end=num-1;//结束位置索引 int index=-1;//默认查找到的位置索引 while(start<=end) { index=(start+end)/2;//折半 if(a[index]>data) { end=index-1; } else { start=index+1; } } if(a[index]<=data)//如果此时的index对应的元素小于或者等于data,则位置找到 index++;//得到插入位置 return index;//返回插入位置 } /******************************************************** *函数名称:FindElem *参数说明:a 无序数组; * num 无序数组长度 *说明: 插入排序,通过二分法查找确定插入位置实现。 *********************************************************/ void InserSort2(int *a,int num) { int i,j,index;//定义循环变量和插入位置的索引 for(i=1;i<num;i++) { index=FindElem(a,i,a[i]);//调用二分查找函数,获得插入位置,每一次外循环确定无序数组前i+1个元素是有序的。 if(i!=index) { int temp=a[i];//获得插入元素 /*//同样可以通过段代码实现,其中区别,主要是j>index和j>=index //处理好移动的位置和插入位置的关系 for(j=i;j>index;j--) { a[j]=a[j-1]; } a[index]=temp;//a[j]=temp同样正确,因为在退出for循环后,j就已经等于index了。 */ for(j=i-1;j>=index;j--) { a[j+1]=a[j]; } a[index]=temp;//插入元素到指定位置 } } }
相关文章推荐
- 插入排序及归并排序java代码实现及详细注释
- 【笔试面试知识点查缺补漏深入理解之C与C++篇】排序的C语言实现-插入-选择-快排
- 中国象棋程序的设计与实现(十二)--棋盘绘制算法(尽管注释非常详细,完全理解仍有难度)
- 静态顺序表的实现及相关操作源代码(插入,删除,排序,逆置,超详细)
- 归并排序c++代码及详细注释
- 快速简单理解——直接插入排序
- 中国象棋程序的设计与实现(十二)--棋盘绘制算法(尽管注释非常详细,完全理解仍有难度)
- 中国象棋程序的设计与实现(十二)--棋盘绘制算法(尽管注释非常详细,完全理解仍有难度)
- (C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)
- (C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)
- 通俗理解插入排序(直接插入排序,折半插入排序,希尔排序)
- 中国象棋程序的设计与实现(十二)--棋盘绘制算法(尽管注释非常详细,完全理解仍有难度)
- [多图预警详细演示一步一步写算法导论]插入排序
- C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆)
- 插入排序的通俗理解
- 插入排序的理解
- (C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)
- 直接插入排序(Straight Insertion Sort)代码及分析注释
- 二叉排序树插入,删除(附详细注释)
- 插入排序的理解