简述

选择排序的基本思想是:每一趟从待排序列中选取关键字最小的元素,作为有序序列的一个新的元素,直到待排序列只剩下一个元素,则完成排序。主要算法有简单选择排序和堆排序。

简单选择排序

算法思想

假设序列为L[1...n],第i趟排序从L[i...n]中选择最小的元素与L(i)交换,因此每一趟可以确定一个元素的最终位置,这样经过n-1趟排序可以使得整个序列有序。

算法性能分析

空间效率:使用常数个辅助单元,故空间复杂度为(O(1))。

时间效率:元素移动操作不会超过(3(n-1))次,最好的情况是0次;而元素比较操作则固定有(sum_{i=1}^{n-1}i)次,所以时间复杂度为(O(n^2))。

稳定性:是不稳定的。

C++实现

#include

using namespace std;

void selectSort(int a[], int n) {

for (int i = 0; i < n; ++i) {

int minIndex = i;

for (int j = i + 1; j < n; ++j) // 找到最小元素的下标

if (a[j] < a[minIndex])

minIndex = j;

if(minIndex != i)

swap(a[i], a[minIndex]); // 放置最小元素

}

}

int main() {

const int SIZE = 10;

int a[SIZE] = { 0 };

for (int i = 0; i < SIZE; ++i) {

a[i] = rand() % 10;

cout << a[i] << " ";

}

cout << "

";

selectSort(a, SIZE);

for (auto elem : a)

cout << elem << " ";

return 0;

}

堆排序

算法思想

堆排序是一种树形选择排序方法,特点是:排序过程中,将序列看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系,每次选择其中的最大(或最小)元素构成有序序列。

在堆排序的过程中,最主要的工作就是调整堆。我们从最后一个结点所在的子树开始筛选(对于大根堆,若根结点关键字小于左右子女中关键字的较大者,则交换),使该子树成为堆。之后向前依次对各结点为根的子树进行筛选,看该结点的值是否大于其左右子节点的值,若不是,则将左右结点中的较大者与之交换,交换后可能会破坏下一级的堆,于是需要继续采用上述方法构造下一级的堆,直到该结点没有子结点为止。重复这个过程,直至达到堆的根结点。

我们首先将调整一棵子树的算法总结出来,用a[0],a[1],...,a[n-1]表示一个堆,故结点a[i]的左孩子结点是a[2i+1],右孩子结点是a[2i+2]。而使用任意左右孩子结点的下标j同样可以获得其父结点,父结点的下标为(j-1)/2。因而我们可以得到以下的算法描述:

暂存需要调整的结点的值t;

判断是否当前需要调整的结点是否还有孩子结点,有则3,没有则5;

找出左右孩子中较大的结点;

如果该较大的结点大于t,则将该孩子结点上移,继续循环,进入2;否则退出循环,进入5;

当前位置即为合适位置,插入t。

有了调整一棵子树的算法,接下来的堆排序就比较简单了,主要有以下步骤:

将序列从最后一个结点的根结点开始逐个往上调整成堆;

取堆中的首元素(即为最大值或最小值)与堆中最后的元素进行交换,例如a[0]与a[n-1];

把交换后的序列重新调整成堆,例如a[0],...,a[n-2]。

这里需要注意的是,由于只交换了一个元素,整个堆是整体符合要求的,因此只需要对交换后的首元素进行堆调整就可以了。

算法性能分析

空间效率:使用常数个辅助单元,空间复杂度为(O(1))。

时间效率:建堆的时间为(O(n)),之后有n-1次调整的操作,每次调整的时间复杂度为(O(h)),故在最好、最坏和平均的情况下,堆排序的时间复杂度为(O(nlog_2n))。

稳定性:调整过程中,有可能把后面的相同关键字元素移动到前面,因此是不稳定的。

C++实现

#include

using namespace std;

// 调整以结点i为根结点的堆

void shiftDown(int a[], int i, int n) {

int t = a[i], j;

while ((j = 2 * i + 1) < n) { // 如果有子结点

if (j + 1 < n && a[j] < a[j + 1]) // 取子结点中较大的结点

++j;

if (t < a[j]) { // 较大的子结点上移

a[(j - 1) / 2] = a[j];

i = j;

}

else

break;

}

a[(j - 1) / 2] = t; // 插入需要调整的结点

}

void heapSort(int a[], int n) {

for (int i = (n - 2) / 2; i >= 0; --i) // 调整成堆

shiftDown(a, i, n);

for (int i = n - 1; i > 0; --i) { // 每次选取堆的根结点

swap(a[0], a[i]);

shiftDown(a, 0, i); // 调整堆

}

}

int main() {

const int SIZE = 10;

int a[SIZE] = { 0 };

for (int i = 0; i < SIZE; ++i) {

a[i] = rand() % 10;

cout << a[i] << " ";

}

cout << "

";

heapSort(a, SIZE);

for (auto elem : a)

cout << elem << " ";

return 0;

}

c++ java 选择排序,选择排序(示例代码)相关推荐

  1. python 代码排布_python实现经典排序算法的示例代码

    以下排序算法最终结果都默认为升序排列,实现简单,没有考虑特殊情况,实现仅表达了算法的基本思想. 冒泡排序 内层循环中相邻的元素被依次比较,内层循环第一次结束后会将最大的元素移到序列最右边,第二次结束后 ...

  2. 一个非常标准的Java连接Oracle数据库的示例代码

    最基本的Oracle数据库连接代码(只针对Oracle11g): 1.右键项目->构建路径->配置构建路径,选择第三项"库",然后点击"添加外部Jar&quo ...

  3. java书号属性,基于Java的ISBN书号查询示例代码-六派数据

    示例代码 本代码示例是基于Java的六派数据接口进行数据请求API服务请求的代码示例,使用前你需要: 以下是完整代码示例: /** * 主函数 * @param args */ public stat ...

  4. java调用wcf_详解JAVA调用WCF服务的示例代码

    这一篇将要解决java中调用WCF的问题,使用的依旧是上一篇中托管在IIS中的WCF服务,本来我是打算用axis来写这篇文章的,可就在我开始之前,无意中发现了在java包中自带的wsimport工具 ...

  5. java代码实现图书管理_Java图书管理系统(用Java常用集合实现)(示例代码)

    图书管理系统 一.需求说明 1.功能:登录,注册,忘记密码,管理员管理,图书管理. 2.管理员管理:管理员的增删改查. 3.图书管理:图书的增删改查. 4.管理员属性包括:id,姓名,性别,年龄,家庭 ...

  6. java模拟摇摆小球程序代码_用java实现跳动的小球示例代码

    实现效果为一个小球接触左右侧时,会反向的运动. import javafx.application.Application; import javafx.event.ActionEvent; impo ...

  7. java json 压缩_Json压缩工具(示例代码)

    一般的json文件拥有很多的空格和注释,虽然读起来比较方便,但是在运行的时候是要占一些内存的. 于是json压缩工具就应运而生了,这个工具是用java做的,原理是: 1:在Eclipse中导出一个可运 ...

  8. java 9999 符号_java 9999(示例代码)

    1. map 1.1. map中的方法 1.2. Map.Entry 对于集合来讲,就是把kye-value的数据保存在了Map.Entry的实例之后,再在Map集合中插入了一个Map.Entry的实 ...

  9. java生成缩略图例子_具体介绍java生成缩略图的方法示例代码

    这篇文章主要介绍了java生成缩略图的方法,结合具体实例形式分析了java生成缩略图过程中所涉及的各种常见的图形处理技巧,需要的朋友可以参考下 本文实例讲述了java生成缩略图的方法.分享给大家供大家 ...

  10. Java内嵌秒表_【Java】Java计时器(秒表)(示例代码)

    import javax.swing.*;importjava.awt.HeadlessException;importjava.awt.BorderLayout;importjava.awt.Flo ...

最新文章

  1. 详解MariaDB数据库的触发器
  2. Python中小括号( )、中括号[ ]和大括号{}分别代表什么?
  3. 日期型转json格式(springboot)
  4. boost::detail::sp_typeinfo_相关的测试程序
  5. C#-数组定义及使用数组的好处 046
  6. 面向对象第四单元小结
  7. [trouble shoot]atol和atoll
  8. JAVA头部声明异常,Java 异常详解
  9. 将PPT内容导出为JPG图片
  10. php mysql 高效,php+mysql 大容量数据高效分页效果(弃用limit)
  11. 【.Net】C#实现多线程的方式:使用Parallel类
  12. java notifyall 唤醒顺序_Java线程中的notifyAll唤醒操作(推荐)
  13. 免费分享20套PHP源码
  14. Fiddler5中文版
  15. 忙碌了一整天,终于弄好了免费电脑版的KTV点歌系统,以后可以K歌了!
  16. IT计算机实习:JAVA实习报告范文(二)
  17. 怎么让电脑微信安装到别的盘路径
  18. 计算机软著发明,时健
  19. Auto.js Pro安卓免ROOT引流脚本开发系列教程25网易公开课(3)-取用户性别
  20. java微信支付 需要证书吗_java引用微信支付的p12证书文件

热门文章

  1. 在Android中将毫秒转换为时间
  2. 100个python案例
  3. curl第六课 Http Digest Auth认证应用
  4. 山川湖海 - Android无障碍代理的那些事
  5. Idle Mystic预售教程
  6. JAVA基础知识-day08
  7. c语言链表之链表后面插入节点
  8. 高通SDM450 ADC读取电池驱动调试
  9. 戴尔电脑开机自检或显示no bootable device found的可行解决方案
  10. 1.高通SEE 虚拟sensor分析