选择排序的几种算法
2015-07-21 17:18
309 查看
选择排序的基本思想是:每趟从n-i+1(i=1,2,…,n-1)个记录中选取关键字最小的记录作为有序序列中第i个元素。
简单选择排序
简单选择排序的过程中,所需记录的移动的操作次数比较少,最小值是0,最大值是3(n-1),然而,无论记录如何排序,所需进行的关键字比较次数相同,均为n(n-1)/2。因此总的时间复杂度是O(n²)。
堆排序
实现堆排序(正序)我理解主要有三个步骤:(1)首先将无序序列建成一个大顶堆;(2)将堆顶元素与最后一个根节点元素交换;(3)将剩余的元素重新调整成一个大顶堆;最后一个步骤也叫“筛选”,就是堆顶的左右子树都是一个大顶堆,但是加上堆顶元素就不是了,筛选的过程就是把整个堆调整成大顶堆。而堆排序的过程就是在不停的重复(2)(3)两个步骤。
堆排序在最坏的情况下,其时间复杂度也是O(nlogn),但堆排序是不稳定的,因为堆排序在刚开始的时候要对无序序列进行一个宏观的调整(也就是建立大顶堆的过程),在这个调整的过程中,会破坏排序的稳定性。
简单选择排序
void SelectSort(Elem R[],int n){ //对R[1]~R 做简单选择排序 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),但堆排序是不稳定的,因为堆排序在刚开始的时候要对无序序列进行一个宏观的调整(也就是建立大顶堆的过程),在这个调整的过程中,会破坏排序的稳定性。
相关文章推荐
- 让App中加入LruCache缓存,轻松解决图片过多造成的OOM
- 剑指off-求两个数和为s在排序序列中
- 让App中加入LruCache缓存,轻松解决图片过多造成的OOM
- sigprocmask阻塞信号
- PC-计算机动行命令里的密密!系统管理程序!
- iOS禁止横屏,tableView去掉左端默认的15空白像素
- ajaxFileUpload plugin上传文件 chrome、Firefox中出现SyntaxError:unexpected token <
- 安卓天天练练(二)相对布局和帧布局
- Android-经常涉及到的权限
- socket编程<二>
- 二维码URL自动辨别Android和ISO设备,以便扫码后倒入不同的下载链接
- 快速排序
- 利用tween.js算法生成缓动效果
- PC-红警联机问题与下载
- 记失败的电话面试
- oracle 11g show spparameter 命令的使用
- Longest Valid Parentheses
- ./configure: error: the HTTP rewrite module requires the PCRE library
- input 之我见1
- 常见内存分配算法及优缺点