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种)相关推荐

  1. C语言基础排序算法-选择排序

    C语言基础排序算法-选择排序 什么是选择排序? 选择排序(Selection sort)是一种简单直观的排序算法,第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从 ...

  2. C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序

    常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...

  3. Java排序算法——选择排序

    Java排序算法--选择排序(Selection sort) 传送门 冒泡排序 插入排序 简述 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找 ...

  4. 十大经典排序算法-选择排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  5. 排序算法-选择排序-堆排序

    排序算法-选择排序-堆排序 堆排序是一种树型选择排序方法.在排序过程中,将 L [ 1... n ] L[1 ... n] L[1...n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点 ...

  6. python排序算法-选择排序

    python排序算法-选择排序 一.选择排序 1.一趟排序纪录最小的数,放在第一个位置 2.再一次排序记录列表无序区最小的数,放在第二个位置 关键 有序区.无序区.无序区最小数的位置 代码 def s ...

  7. 排序算法--选择排序(Java实现)

    选择排序概念 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中 ...

  8. 排序算法---选择排序(java版)

    简单选择排序 原理 选择排序(Selection Sort)的原理有点类似插入排序,也分已排序区间和未排序区间.但是选择排序每次会从排序区间中找到最小的元素,将其放到已排序区间的末尾. 简单选择排序执 ...

  9. 排序算法——选择排序法(Select Sorting)

    选择排序(Select Sorting) 基本介绍 ​ 选择排序也属于内部排序法,是从预排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的 选择排序思想 ​ 选择排序(Selec ...

最新文章

  1. buider模式的缺陷
  2. Python字符串删除指定符号(不限位置)
  3. 【Python基础】Python列表生成式
  4. 服务器旧图片维护,图片服务器
  5. 淘宝首页的HTML以及CSS技术点
  6. jdbc关于操作Oracle时间数据解析
  7. 面试题 01.03. URL化
  8. 安全开发Java:日志注入,并没那么简单
  9. 【转】简单的解释XSS攻击
  10. jsp中用java写标签id_jsp中自定义标签用法实例分析
  11. 【最短路径问题笔记】SPFA算法及负环的判断
  12. [Swustoj 24] Max Area
  13. android阴影edittext,android – 将阴影效果添加到EditText字段
  14. BIGEMAP地图下载器(91卫图助手)功能对比
  15. H.264文件解析与码流分析
  16. 为ARM处理器实现Machine Forth
  17. 二等水准数据平差_二等水准测量方法与步骤
  18. 1000道Java面试题之Java IO 附答案
  19. 计算机网络简明教程期末考试试题,《计算机网络技术简明教程》复习资料
  20. Skyline二次开发-如何使用API获取视线分析的可见点和不可见点。

热门文章

  1. python项目-30 个惊艳的Python开源项目
  2. python详细安装步骤-Python的详细安装步骤
  3. python经典好书-有哪些 Python 经典书籍?
  4. python安装步骤图解-Python安装与卸载流程详细步骤(图解)
  5. python面向对象编程的优点-Python 基础知识----面向对象编程
  6. python图片识别-Python+Opencv识别两张相似图片
  7. python论坛哪些好-好的python论坛
  8. python期末考试题及答案翻译-用 python 解 NOIP 竞赛题
  9. python入门基础代码图-适合Python入门的5本基础书籍
  10. python画代码-一行Python代码画心型