插入排序
来源:互联网 发布:多益网络实力 编辑:程序博客网 时间:2024/06/15 02:28
先用一个简单的例子来说明一下插入排序的方法。
假设要对数组|5|1|4|6|进行排序,插入排序的方法为,从第二个元素,即1开始到结尾,每一轮把当前考察的元素放置在它正确的位置上。这么说还是有点抽象,结合例子来理解。
第一轮:
这一轮所要做的事情是把第二个元素即1,放置在合适的位置上。
原:|5|1|4|6|
1)|1|5|4|6|
因为1比5小,所以和5交换了位置,此时前2个元素已经有序。
第二轮:
把第三个元素,即4放置在合适的位置上。
原:|1|5|4|6|
1)|1|4|5|6|
因为4比5小,所以和4交换位置。
2)|1|4|5|6|
由于4比1大,所以不需要交换,这一轮结束。此时前三个元素已经有序。
第三轮:
把第四个元素,即6放置在合适的位置上。
原:|1|4|5|6|
1)|1|4|5|6|
因为6比5大,所以不需要交换位置,又因为前面三个元素已经有序,所以现在整个数组已经有序,排序到此完成。
下面是C++的代码实现:
template<typename T>void SelectionSort1( T arr[], int n ){ //从第二个元素开始,将每一个元素放置在它前面已有序数组的合适位置上 for( int i = 1; i < n; i ++ ) //最后一组的比较是arr[1]和arr[0]所以循环结束条件是 j > 0 for( int j = i; j > 0; j -- ){ if( arr[j] < arr[j-1] ) swap( arr[j], arr[j-1] ); else//如果考察的元素已经放置在合适的位置上,则退出此次循环 break; }}
这个插入排序算法,还有可以优化的地方,在上述的代码实现中,我们频繁地使用了交换操作,我们知道,一次交换实际上相当于三次赋值操作,所以如果能够对交换操作进行优化,我们就能够优化这个插入排序。噢,实际上,我们其实并不需要进行那么多次交换操作,也能达到目的。我们先把当前考察的元素复制一份出来,然后把之前的交换操作换成赋值操作,这样就将先前的交换(相当于三次赋值)替换为赋值操作。详细代码如下:
template<typename T>void insertionSort(T arr[], int n){ for( int i = 1 ; i < n ; i ++ ) { // 寻找元素arr[i]合适的插入位置 T e = arr[i]; int j; // j保存元素e应该插入的位置 for (j = i; j > 0 && arr[j-1] > e; j--) arr[j] = arr[j-1]; arr[j] = e; } return;}
阅读全文
0 0
- 插入排序-【插入排序】
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 输入输出挂模板
- The Unique MST POJ
- python自动化工具之pywinauto(二)
- JavaScript类型转换
- (M)Dynamic Programming:368. Largest Divisible Subset
- 插入排序
- IPC进程通信机制---------AIDL实战
- 第十二章 表单元素
- codeforces The Artful Expedient(数学思维题)
- kotlin学习笔记-2-基础语法
- hdu3440--SPFA建图
- 放弃时间的人,时间也会放弃他..
- HttpCore 前言
- Data Center Software 协议分析工具的使用