[排序算法] 选择排序(2种)
1.直接选择排序
【思想】选出剩下的未排序数据中的最小元素与第i个元素交换
【特点】不稳定
空间代价:O(1)
时间代价:O(n^2)
1 void SelectSort(int Array[], int n) 2 { 3 // 依次选出第i小的记录,即剩余记录中最小的那个 4 for (int i=0; i< n - 1; i ++) 5 { 6 // 首先假设记录i就是最小的 7 int Min = i; 8 // 开始向后扫描所有剩余记录 9 for (int j = i + 1; j < n; j++) 10 // 如果发现更小的记录,记录它的位置 11 if (Array[j] < Array[Min]) 12 Min = j; 13 //将第i小的记录放在数组中第i个位置 14 swap(Array[i], Array[Min]); 15 } 16 }
2.堆排序
【思想】基于最大推来实现,效率更高。堆排序的基本思想是:首先将n个记录按关键码建成堆(初始堆),将堆顶元素与最后一个元素交换,然后将剩余的元素调整成堆...如此反复,便得到了一个按关键码有序的序列。
可参考我整理的最大堆的类实现http://www.cnblogs.com/lca1826/p/6590864.html
【特点】不稳定
空间代价:O(1)
时间代价:O(nlogn)
1 /* 2 堆排序 3 (1)用大根堆排序的基本思想 4 ① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区 5 ② 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换, 6 由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key 7 ③ 由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。 8 然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换, 9 由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n- 2].keys≤R[n-1..n].keys, 10 同样要将R[1..n-2]调整为堆。 11 …… 12 直到无序区只有一个元素为止。 13 14 (2)大根堆排序算法的基本操作: 15 ① 初始化操作:将R[1..n]构造为初始堆; 16 ② 每一趟排序的基本操作:将当前无序区的堆顶记录R[1]和该区间的最后一个记录交换,然后将新的无序区调整为堆(亦称重建堆)。 17 18 注意: 19 ①只需做n-1趟排序,选出较大的n-1个关键字即可以使得文件递增有序。 20 ②用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。 21 堆排序和直接选择排序相反:在任何时刻,堆排序中无序区总是在有序区之前, 22 且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止。 23 */ 24 #include <iostream> 25 using namespace std; 26 27 void HeapAdjust(int SortData[],int StartIndex, int Length) 28 { 29 int MaxChildIndex = 2*StartIndex + 1; 30 while(MaxChildIndex < Length) 31 { 32 //比较左子树和右子树,记录最大值的j 33 if((MaxChildIndex < Length - 1) && (SortData[MaxChildIndex] < SortData[MaxChildIndex + 1])){ 34 MaxChildIndex ++; 35 } 36 if(SortData[StartIndex] < SortData[MaxChildIndex]) 37 { 38 //交换i与j位置的数据 39 int temp = SortData[StartIndex]; 40 SortData[StartIndex] = SortData[MaxChildIndex]; 41 SortData[MaxChildIndex] = temp; 42 //堆被破坏,重新调整 43 StartIndex = MaxChildIndex; MaxChildIndex = 2*StartIndex + 1; 44 } 45 else break; 46 } 47 return; 48 } 49 50 //堆排序 51 void HeapSortData(int SortData[], int Length) 52 { 53 int i=0; 54 55 //将SortData[0,Lenght-1]建成大根堆 56 for (i=Length/2-1; i>=0; i--) 57 { 58 HeapAdjust(SortData, i, Length); 59 } 60 61 for (i=Length-1; i>0; i--) 62 { 63 //与最后一个记录交换 64 int tmpData =SortData[0]; 65 SortData[0] =SortData[i]; 66 SortData[i] =tmpData; 67 //将SortData[0..i-1]重新调整为大根堆 68 HeapAdjust(SortData, 0, i); 69 } 70 return; 71 } 72 73 int main() 74 { 75 int array[6] = {10, 15, 56, 25, 30, 70}; 76 HeapSortData(array, 6); 77 for (int index = 0; index != 6; ++index) 78 { 79 cout<<array[index]<<" "; 80 } 81 cout<<endl; 82 return 0; 83 }
转载于:https://www.cnblogs.com/lca1826/p/6486261.html
[排序算法] 选择排序(2种)相关推荐
- C语言基础排序算法-选择排序
C语言基础排序算法-选择排序 什么是选择排序? 选择排序(Selection sort)是一种简单直观的排序算法,第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从 ...
- C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序
常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...
- Java排序算法——选择排序
Java排序算法--选择排序(Selection sort) 传送门 冒泡排序 插入排序 简述 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找 ...
- 十大经典排序算法-选择排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 排序算法-选择排序-堆排序
排序算法-选择排序-堆排序 堆排序是一种树型选择排序方法.在排序过程中,将 L [ 1... n ] L[1 ... n] L[1...n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点 ...
- python排序算法-选择排序
python排序算法-选择排序 一.选择排序 1.一趟排序纪录最小的数,放在第一个位置 2.再一次排序记录列表无序区最小的数,放在第二个位置 关键 有序区.无序区.无序区最小数的位置 代码 def s ...
- 排序算法--选择排序(Java实现)
选择排序概念 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中 ...
- 排序算法---选择排序(java版)
简单选择排序 原理 选择排序(Selection Sort)的原理有点类似插入排序,也分已排序区间和未排序区间.但是选择排序每次会从排序区间中找到最小的元素,将其放到已排序区间的末尾. 简单选择排序执 ...
- 排序算法——选择排序法(Select Sorting)
选择排序(Select Sorting) 基本介绍 选择排序也属于内部排序法,是从预排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的 选择排序思想 选择排序(Selec ...
最新文章
- buider模式的缺陷
- Python字符串删除指定符号(不限位置)
- 【Python基础】Python列表生成式
- 服务器旧图片维护,图片服务器
- 淘宝首页的HTML以及CSS技术点
- jdbc关于操作Oracle时间数据解析
- 面试题 01.03. URL化
- 安全开发Java:日志注入,并没那么简单
- 【转】简单的解释XSS攻击
- jsp中用java写标签id_jsp中自定义标签用法实例分析
- 【最短路径问题笔记】SPFA算法及负环的判断
- [Swustoj 24] Max Area
- android阴影edittext,android – 将阴影效果添加到EditText字段
- BIGEMAP地图下载器(91卫图助手)功能对比
- H.264文件解析与码流分析
- 为ARM处理器实现Machine Forth
- 二等水准数据平差_二等水准测量方法与步骤
- 1000道Java面试题之Java IO 附答案
- 计算机网络简明教程期末考试试题,《计算机网络技术简明教程》复习资料
- Skyline二次开发-如何使用API获取视线分析的可见点和不可见点。
热门文章
- python项目-30 个惊艳的Python开源项目
- python详细安装步骤-Python的详细安装步骤
- python经典好书-有哪些 Python 经典书籍?
- python安装步骤图解-Python安装与卸载流程详细步骤(图解)
- python面向对象编程的优点-Python 基础知识----面向对象编程
- python图片识别-Python+Opencv识别两张相似图片
- python论坛哪些好-好的python论坛
- python期末考试题及答案翻译-用 python 解 NOIP 竞赛题
- python入门基础代码图-适合Python入门的5本基础书籍
- python画代码-一行Python代码画心型