2.选择排序(直接选择排序和堆排序)
来源:互联网 发布:手机浏览器软件下载 编辑:程序博客网 时间:2024/04/29 06:20
选择排序的基本思想:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已拍好序子表的最后,直到全部记录排序完毕。
由于选择排序方法每一趟总是从无序区中选出全局最小(最大)的关键字,所以适合于从大量的记录中选择一部分排序记录。
1.直接选择排序
基本思想:n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。(从小到大,每次将a[i]到a[n]中最小的值找到,并放到a[i]处)
void Select_sort(int a[],int size){int i,j,k;for (i=0;i<size;i++)//做第i趟排序{k=i;for (j=i+1;j<size;j++)//在当前无序区选择最小的记录{if(a[j]<a[k]){k=j;//k记下目前找到的最小关键字所在的位置。}if (k != i){a[i]^=a[k];//一趟排序仅交换一次。a[k]^=a[i];a[i]^=a[k];}}}}直接选择排序是一个不稳定的排序方法,该方法得到平均时间复杂度为O(n^2)。
2.堆排序
堆排序是一种树形选择排序方法,它的特点是:在排序过程中,将无序区看成一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系,在当前无序区中选择关键字最大的记录。
二叉堆的特性:
1、父结点的键值总是>=(<=)任何一个子结点的键值
2、每个结点的左右子树都是二叉堆
void sift(int a[],int low,int high)//构造初始堆{int i=low,j=2*i;//i为父结点,j为子结点的左孩子。int temp = a[i];//将父结点的值保存到临时变量中while (j <= high)//保证j在有效范围内{if (j<high && a[j]<a[j+1])//比较两个孩子值的大小,获取值最大的下表。左孩子大则j=2*i,右孩子大则j=2*i+1。{j++;}if (temp<a[j]){a[i]=a[j];//比较父结点与最大孩子结点值的大小,如果孩子结点值大,则将a[j]调整到父结点。i=j;//修改i值(父结点下标),以便继续向下筛选。j=2*i;//修改j值(子结点下标)}else break;}a[i]=temp;}void HeapSort(int a[],int size){int i;int temp;for (i=size/2;i>=1;i--)//循环建立初始堆{sift(a,i,size);}for (i=size;i>1;i--)//将最后一个元素同当前区间内a[1]对换。{temp = a[1];a[1] = a[i];a[i] = temp;sift(a,1,i-1);//筛选a[i]结点,得到i-1个结点的堆。}}堆排序是一种不稳定的排序算法,该算法的平均时间复杂度为O(nlogn)。
0 0
- 2.选择排序(直接选择排序和堆排序)
- 2.选择排序:直接选择排序和堆排序
- 算法-排序-选择排序(直接选择和堆排序)
- 选择排序(直接选择、堆排序)
- 选择排序(直接选择、堆排序)
- 选择排序(直接选择和堆排序)
- 排序:选择排序(直接选择排序、堆排序)
- 【排序】选择排序(直接选择排序、堆排序)
- 选择排序:直接选择排序 堆排序
- 选择排序:直接选择排序,堆排序
- 选择排序(直接选择排序,堆排序)
- 内排序(2)选择排序:直接选择和堆排序
- 选择排序(直接、堆)
- 算法分析-选择排序(直接选择排序 & 堆排序)
- 选择排序 (直接选择排序 ,堆排序)
- 选择排序(直接选择排序、堆排序)
- 经典算法之选择排序(直接选择、堆排序)
- 排序-选择排序(直接选择排序)
- Adblock Plus官方规则Easylist China说明与反馈贴(2015.12.15)
- LeetCode 015 3Sum
- Python学习网站
- xcode如何实现多工程联编
- 如何暂停和恢复CALayer上的动画
- 2.选择排序(直接选择排序和堆排序)
- php扩展开发
- 点击空白位置触发事件
- Eclipse Hibernate工具的错误: “Fetching children of Database”解决办法
- java 实现zip压缩的三种好方法
- dce处置组播
- pickeview 的用法 collection定制化pickview
- DataTable 使用linq方法获得某列分组列表
- eclipse 使用FAQ