排序算法
来源:互联网 发布:网络维保服务体系 编辑:程序博客网 时间:2024/06/06 04:26
(一)冒泡排序算法
1.基本思想:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止;
2.例子:
3.代码:
(1)在每次循环中,通过交换反序的相邻数据,使较小的数字如同气泡般慢慢地浮到上面;
(2)若在一次循环中,没有数字往上冒,证明已经排好序了;
(二)直接插入排序
1.基本思想:将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增1的有序表;
2.例子:
3.代码:
(1)每次循环都将新的数据插入到之前的数据中,需要对原有的数据做移动,空出一个合适的位置;
(三)简单选择排序
1.基本思想:通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1=<i<=n)个记录交换之;
2.例子:
3.代码:
(1)每次循环都选择一个最小的数,交换放到前面去;
(2)简单选择排序算法总体上优于冒泡排序算法,因为其交换数据的次数少;上述例子中,最多做8次交换;
(四)快速排序
1.基本思想:先从数列中取出一个数作为基准数,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边,再对左右区间重复以上步骤,直到各区间只有一个数(分治思想);
2.例子:
3.代码:
(五)希尔排序
1.基本思想:将相距某个“增量”的记录组成一个子序列,在这些子序列内分别进行直接插入排序,当整个序列基本有序时,再对全体记录进行一次直接插入排序;
2.例子:
(1)原始记录如下:
(2)根据增量分隔子序列并内部排序(注意最终增量必须为1):
3.代码:
(六)堆排序
1.基本思想:将待排序的序列构造成一个大顶堆;此时,整个序列的最大值就是堆顶的根结点;将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次大值,如此反复执行,便能得到一个有序序列;
2.例子:
PS:堆排序中,堆是以层序遍历的形式存储在数组中的;建堆的过程其实就是依次调整堆的过程,从最后一个非叶子结点开始调整;
3.代码:
//生成大根堆 void HeapAdjust(int SortData[],int StartIndex, int Length) { while(2*StartIndex+1 < Length) { int MinChildrenIndex = 2*StartIndex+1 ; if(2*StartIndex+2 < Length ) { //判断是否有右子树,若有的话则取较大的子树的index if(SortData[2*StartIndex+1]<SortData[2*StartIndex+2]) { MinChildrenIndex = 2*StartIndex+2; } } if(SortData[StartIndex] < SortData[MinChildrenIndex]) { //交换i与MinChildrenIndex的数据 int tmpData =SortData[StartIndex]; SortData[StartIndex] =SortData[MinChildrenIndex]; SortData[MinChildrenIndex] =tmpData; //堆被破坏,需要重新调整 StartIndex = MinChildrenIndex ; } else { //比较左右孩子均大则堆未破坏,不再需要调整 break; } } return; } //堆排序 void HeapSortData(int SortData[], int Length) { int i=0; //将Hr[0,Lenght-1]建成大根堆 for (i=Length/2-1; i>=0; i--) { HeapAdjust(SortData, i, Length); } for (i=Length-1; i>0; i--) { //与最后一个记录交换 int tmpData =SortData[0]; SortData[0] =SortData[i]; SortData[i] =tmpData; //将H.r[0..i]重新调整为大根堆 HeapAdjust(SortData, 0, i); } return; } int main() { int SortData[] ={12,36,24,85,47,30,53,91}; HeapSortData(SortData, 8); for (int i=0; i<8; i++) { std::cout<<SortData[i]<<" "; } std::cout<<std::endl; return 0; }
(七)归并排序
1.基本思想:假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或者1的有序子序列;再两两归并,。。。,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序;
2.例子:
(八)总结
1.排序算法对比:
2.排序算法分类:
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- Python爬虫之自动登录与验证码识别
- MCU引脚输出模式中推挽输出与开漏输出电路原理区别
- 使用github和jekyll搭建博客过程
- 【5-2】搭一个zookeeper集群
- 从网上收集的Linux命令
- 排序算法
- 初学并查集
- Octave 基础操作及解决安装绘图工具gnuplot时出现unknown terminal错误
- 并发编程之同步互斥篇
- 前端好的文档收藏
- tsiLdetroSmorfsetacilpuDevomeR.83
- 蓝桥杯 基础练习 十六进制转十进制 java
- 积跬步至千里系列之六--安装与卸载应用程序(PackageInstaller)(一)
- 抽象类与接口