选择排序的几种算法
来源:互联网 发布:网络在线英语培训 编辑:程序博客网 时间:2024/06/06 10:54
选择排序的基本思想是:每趟从n-i+1(i=1,2,…,n-1)个记录中选取关键字最小的记录作为有序序列中第i个元素。
简单选择排序
void SelectSort(Elem R[],int n){ //对R[1]~R[n]做简单选择排序 int i; for(i=1;i<n;i++){ j=SelectMinKey(R,i); //在R[i...n]中选择选择key最小的记录 if(i!=j) R[i]<---->R[j] //与第i个记录交换 }}
简单选择排序的过程中,所需记录的移动的操作次数比较少,最小值是0,最大值是3(n-1),然而,无论记录如何排序,所需进行的关键字比较次数相同,均为n(n-1)/2。因此总的时间复杂度是O(n²)。
堆排序
实现堆排序(正序)我理解主要有三个步骤:(1)首先将无序序列建成一个大顶堆;(2)将堆顶元素与最后一个根节点元素交换;(3)将剩余的元素重新调整成一个大顶堆;最后一个步骤也叫“筛选”,就是堆顶的左右子树都是一个大顶堆,但是加上堆顶元素就不是了,筛选的过程就是把整个堆调整成大顶堆。而堆排序的过程就是在不停的重复(2)(3)两个步骤。
void HeadAdjust(Elem R[],int s,int m){ //已知Elem R[s...m]中记录的关键字除R[s].key之外均满足堆的定义,本函数调整R[s].key //的关键字,使R[s...m]成为一个大顶堆 Elem rc = R[s]; int j; for(j=2*s;j<=m;j*=2){ //沿KEY较大的孩子结点向下筛选 if(j<m&&R[j].key<R[j+1].key) ++j; //将j移向记录较大的孩子结点的下标 if(rc.key>R[j].key) break; //rc最大,即应该插到位置s上 R[s]=R[j]; s=j; } R[s]=rc; //插入}void HeadSort(Elem R[],int n){ //将R[1...n]建成大顶堆 for(i=n/2;i>0;--i){ HeadAdjust(R,i,n); } for(i=n;i>1;--i){ Swap(R[1],R[i]); //将堆顶记录与大顶堆R[1...i]的最后一个记录交换 HeadSort(R,1,i-1); //将R[1...i-1]重新调整为大顶堆 }}
堆排序在最坏的情况下,其时间复杂度也是O(nlogn),但堆排序是不稳定的,因为堆排序在刚开始的时候要对无序序列进行一个宏观的调整(也就是建立大顶堆的过程),在这个调整的过程中,会破坏排序的稳定性。
0 0
- 选择排序的几种算法
- 几种常见的排序算法---选择排序
- 关于几种简单的排序算法-插入、冒泡、选择
- 几种基本的排序算法:选择排序、插入排序、冒泡排序
- 几种排序算法(冒泡排序算法,选择排序算法,快速排序算法,插入排序)
- 几种改良的排序,堆排序,希尔排序,快速排序--堆排序篇(改良的选择排序算法)
- 常见的几种排序算法一-选择排序,插入排序
- (一)几种排序算法的学习总结(选择排序与插入排序)
- 几种常用的排序算法(快速排序,希尔排序,堆排序,选择排序,冒泡排序)
- 几种常用的排序算法:插入排序、冒泡排序、选择排序的算法及C++实现
- C语言常用的几种排序算法代码(选择排序,冒泡排序,插入排序,快速排序)
- 冒泡,去重,快速排序选择排序几种算法
- 总结几种排序算法(二)---选择排序
- 几种常见的排序算法及其时间复杂度——选择排序(三)
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 排序的几种算法
- 几种排序的算法
- 几种常见的排序算法,选择排序,冒泡排序,希尔排序,堆排序,快速排序,归并排序,基数排序的比较
- Android声明和使用权限
- 快速排序
- http://www.gutirunhua.com/news/company/68.html
- socket编程<二>
- hdu 1023 Train Problem II (卡特兰数)
- 选择排序的几种算法
- sigprocmask阻塞信号
- 集合
- Nodejs 安装 grunt ,Webstorm grunt 配置
- http statusCode(状态码) 200、300、400、500序列
- Maven学习--------基础2
- freemarker 异常和错误显示
- 设计模式-工厂方法模式(Factory Method)
- Mac: Android studio+VirtualBox+Genymotion