排序 -- 思路简析(二)
2016-01-03 10:45
274 查看
简介
本篇文章总结一下最近学习的排序算法,提炼出其思想及不同之处。有直接插入排序,希尔排序,选择排序直接插入排序(Insert Sort)
每次将无序区的第一个记录按关键字插入到有序区的合适位置,并将有序区长度加一[code] // 将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,对整个序列进行一次直接插入排序[code]//对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)
从待排序的序列中选择最小或者最大的元素,并将其交换到已排序的尾部[code] // 对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; } } }
相关文章推荐
- SQL SERVER CHAR ( integer_expression )各版本返回值差异的案例
- 资源(先备着)
- hdu 5606
- matlab中sort函数的用法
- bzoj 2330 [SCOI2011]糖果(差分约束系统)
- 读《重构》1~3章
- Kaggle:What's Cooking?
- JavaScript:void(0);的作用
- Struts2 web.xml文件配置
- QT编译出错解决方法
- Python 决定迁移到 GitHub
- JavaScript进阶(二)在一个JS文件中引用另一个JS文件
- matlab中repmat函数的用法
- JavaScript进阶(二)在一个JS文件中引用另一个JS文件
- C#编程中的三中结构
- HIbernate inverse和cascade属性
- 《Monkey Android》第15课Spinner和AutoCompleteTextView
- 大数据工程师为什么要学习scala
- 一起talk C栗子吧(第八十八回:C语言实例--使用管道进行进程间通信一)
- AFN网络框架2.x版—返回XML的情况