排序 -- 思路简析(二)
来源:互联网 发布:淘宝代发怎么发货 编辑:程序博客网 时间:2024/06/06 17:18
简介
本篇文章总结一下最近学习的排序算法,提炼出其思想及不同之处。有直接插入排序,希尔排序,选择排序
直接插入排序(Insert Sort)
每次将无序区的第一个记录按关键字插入到有序区的合适位置,并将有序区长度加一
// 将a[0..len]进行插入排序,0号单元为哨兵 void InsertSort(int a[],int len){ // i标记有序区的最后一个位置 for(int i = 1; i < len; i ++){ // 如果需要将a[i+1]插入有序序列 if( a[i] > a[i+1] ){ a[0] = a[i+1]; int j = i+1; // 移动,记住<= >= while(j>0 && a[j]>=a[0]){ a[j] = a[j-1]; j --; } a[j+1] = a[0]; } }}
最坏情况下时间复杂度O(n²)
希尔排序(Shell Sort)
希尔排序是将整个待排序列(R₁,R₂,R₃,… Rn)按增量d划分成d个子序列,其中第i(1<=i<=d)个子序列为(Ri,Ri+d,Ri+2d,…Ri+kd ),并分别对各个子序列进行直接插入排序;不断减小增量d,重复这一过程,直到d减少到1,对整个序列进行一次直接插入排序
//对a[1..len]做一趟增量序列为 d 的希尔排序 void ShellInsert(int a[],int len,int d){ for( int i = 1; i + d <= len; i ++ ){ if( a[i] > a[i+d] ){ a[0] = a[i+d]; int j = i+d; // 并且判断是否继续移动 ★★ while(j-d>0 && a[j]>=a[0]){ a[j] = a[j-d]; j -= d; } a[j+d] = a[0]; } }}void ShellSort(int a[],int len, int b[],int dlen){ for( int i = 0; i < dlen; i ++ ){ ShellInsert(a,len,b[i]); }}
希尔排序的时间复杂度是所取增量序列的函数,尚难准确分析。
希尔排序是不稳定排序
选择排序(Selection Sort)
从待排序的序列中选择最小或者最大的元素,并将其交换到已排序的尾部
// 对a[1..len]进行选择排序 void SelectionSort(int a[],int len){ int sel; for(int i = 1; i <= len; i ++ ){ sel = i; for( int j = i; j <= len; j ++){ if( a[sel] > a[j] )// 选出最小 sel = j; } // 进行交换 if( sel != i ){ int t = a[sel]; a[sel] = a[i]; a[i] = t; } }}
1 0
- 排序 -- 思路简析(二)
- 表排序(思路二)
- 排序 -- 思路简析(一)
- 表排序(思路一)
- BreezeCMS实现思路(二)
- 常见算法基础题思路简析(一)-排序篇
- 常见算法基础题思路简析(一)-排序篇
- 常见算法基础题思路简析(二)-链表篇
- java 汉字排序(思路一)
- 字典树排序(思路分析)
- 优化一般思路/模式(二)
- (教学思路 C#集合二)哈希表
- Andriod-手电筒应用小思路(二)
- 解决复杂问题的思路(二)
- react + redux大体思路(二)
- 写框架思路进程(二)
- 快速排序--个人思路与书本思路 (复习排序算法)
- 排序(二):希尔排序
- 学习笔记栈
- ros用rqt_graph显示节点关系、rqt_plot显示数据流、rqt_console显示节点的输出、rqt_logger_level
- Nginx学习
- 排序 -- 思路简析(一)
- 啊违法
- 排序 -- 思路简析(二)
- shell 基础 第二部分 ( cut ,sort, wc,uniq,tee ,tr)
- 第七节 独立按键之中断方式
- Label转成URL
- 四阶幻方的穷举求解.
- IDEA快捷键
- 基于NLPIR的lucene 自定义Analyzer实现类
- oracle rman全备恢复实践
- 网页漂浮窗