选择排序的基本思想是:每一趟从n-i+1 (i=1,2,…,n)个元素中选取一个关键字最小的元素作为有序序列中第i个元素。本节在介绍简单选择排序的基础上,给出了对其进行改进的算法堆排序。

1.简单选择排序

  a:算法描述

  

  简单选择排序的基本思想非常简单,即:第一趟,从n个元素中找出关键字最小的元素与第一个元素交换;第二趟,在从第二个元素开始的n-1个元素中再选出关键字最小的元素与第二个元素交换;如此,第k趟,则从第k个元素开始的n-k+1个元素中选出关键字最小的元素与第k个元素交换,直到整个序列按关键字有序。

  b:算法实现

  

 public void selectSort(int[] r, int low, int high) {for (int k = low; k < high - 1; k++) { // 作n-1趟选取int min = k;for (int i = min + 1; i <= high; i++)// 选择关键字最小的元素if (compare(r[i], r[min]))min = i;if (k != min) {int temp = r[k]; // 关键字最小的元素与元素r[k]交换r[k] = r[min];r[min] = temp;}// end of if}// end of for(int k=0…}// end of selectSort

  

【效率分析】
空间效率:显然简单选择排序只需要一个辅助空间。

时间效率:在简单选择排序中,所需移动元素的次数较少,在待排序序列已经有序的情况下,简单选择排序不需要移动元素,在最坏的情况下,即待排序序列本身是逆序时,则移动元素的次数为3(n-1)。然而无论简单选择排序过程中移动元素的次数是多少,在任何情况下,简单选择排序都需要进行n(n-1)/2次比较操作,因此简单选择排序的时间复杂度为Ο(n²)

  c:算法示例

  SelectSort.java

package com.test.sort.selection;public class SelectSort {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("简单选择排序排序功能实现》》》》");int[] arr = { 23, 54, 6, 2, 65, 34, 2, 67, 7, 9, 43 };SelectSort sort = new SelectSort();System.out.println("排序之前序列:");sort.printArr(arr);sort.selectSort(arr, 0, arr.length - 1);System.out.println("排序之后序列:");;sort.printArr(arr);}public void selectSort(int[] r, int low, int high) {for (int k = low; k < high - 1; k++) { // 作n-1趟选取int min = k;for (int i = min + 1; i <= high; i++)// 选择关键字最小的元素if (compare(r[i], r[min]))min = i;if (k != min) {int temp = r[k]; // 关键字最小的元素与元素r[k]交换r[k] = r[min];r[min] = temp;}// end of if}// end of for(int k=0…}// end of selectSortpublic boolean compare(int paramA, int paramB) {if (paramA < paramB) {return true;} else {return false;}}/*** 依次打印出数组元素*/public void printArr(int[] arr) {if (arr != null) {for (int temp : arr) {System.out.print(temp + "   ");}System.out.println();}}
}

  

  d:结果输出

2.堆排序

  a:算法描述

  

    设有n个元素,欲将其按关键字排序。可以首先将这n个元素按关键字建成堆,将堆顶元素输出,得到n个元素中关键字最大(或最小)的元素。然后,再将剩下的n-1个元素重新建成堆,再输出堆顶元素,得到n个元素中关键字次大(或次小)的元素。如此反复执行,直到最后只剩一个元素,则可以得到一个有序序列,这个排序过程称之为堆排序。堆排序需要解决两个问题,一个是如何将n个元素的序列按关键字建成堆;一个是输出堆顶元素后,怎样调整剩余n-1个元素,使其按关键字成为一个新堆。

                        调整堆结构

                      初始堆建立过程

  b:算法实现

 public void heapSort(int[] r) {int n = r.length - 1;for (int i = n / 2; i >= 1; i--)// 初始化建堆heapAdjust(r, i, n);for (int i = n; i > 1; i--) { // 不断输出堆顶元素并调整r[1..i-1]为新堆int temp = r[1]; // 交换堆顶与堆底元素r[1] = r[i];r[i] = temp;heapAdjust(r, 1, i - 1); // 调整}}// 已知r[low..high]中除r[low]之外,其余元素均满足堆的定义private void heapAdjust(int[] r, int low, int high) {int temp = r[low];for (int j = 2 * low; j <= high; j = j * 2) { // 沿关键之较大的元素向下进行筛选// j指向关键之较大的元素if (j < high && compare(r[j], r[j + 1]))j++;// 若temp比其孩子都大,则插入到low所指位置if (!compare(temp, r[j]))break;r[low] = r[j];low = j; // 向下筛选}r[low] = temp;}

  

  c:算法示例

HeapSort.java

package com.test.sort.selection;public class HeapSort {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("堆排序排序功能实现》》》》");int[] arr = {1, 54, 6, 1, 65, 34, 2, 67, 7, 9, 43 };HeapSort sort = new HeapSort();System.out.println("排序之前序列:");sort.printArr(arr);sort.heapSort(arr);System.out.println("排序之后序列:");sort.printArr(arr);}public void heapSort(int[] r) {int n = r.length - 1;for (int i = n / 2; i >= 1; i--)// 初始化建堆heapAdjust(r, i, n);for (int i = n; i > 1; i--) { // 不断输出堆顶元素并调整r[1..i-1]为新堆int temp = r[1]; // 交换堆顶与堆底元素r[1] = r[i];r[i] = temp;heapAdjust(r, 1, i - 1); // 调整}}// 已知r[low..high]中除r[low]之外,其余元素均满足堆的定义private void heapAdjust(int[] r, int low, int high) {int temp = r[low];for (int j = 2 * low; j <= high; j = j * 2) { // 沿关键之较大的元素向下进行筛选// j指向关键之较大的元素if (j < high && compare(r[j], r[j + 1]))j++;// 若temp比其孩子都大,则插入到low所指位置if (!compare(temp, r[j]))break;r[low] = r[j];low = j; // 向下筛选}r[low] = temp;}public boolean compare(int paramA, int paramB) {if (paramA < paramB) {return true;} else {return false;}}/*** 依次打印出数组元素*/public void printArr(int[] arr) {if (arr != null) {for (int temp : arr) {System.out.print(temp + "   ");}System.out.println();}}}

  

  d:结果输出

转载于:https://www.cnblogs.com/zhangminghui/p/4181121.html

数据结构与算法之排序(归纳总结三)相关推荐

  1. CAUC数据结构与算法期末复习归纳(二)

    CAUC数据结构与算法期末复习归纳(二) 二叉树 二叉树的周游 二叉树的抽象数据类型 深度优先周游二叉树或其子树 广度优先周游二叉树 二叉树的存储结构 二叉树的链式存储结构 二叉搜索树 二叉搜索树的性 ...

  2. 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)

    我的上一篇文章向大家介绍了排序算法中的冒泡排序.插入排序和选择排序.它们都是平均时间复杂度为 O(n^2) 的排序算法,同时还为大家讲解了什么是原地排序和什么是排序的稳定性.下图是这三种算法的比较,不 ...

  3. 数据结构与算法之排序算法

    数据结构与算法之排序算法 排序算法的介绍 ​ 排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排序的过程. 排序的分类 1)内部排序:指将需要处理的数据都加载到内部 ...

  4. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  5. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  6. 数据结构与算法(Python)第三天

    数据结构与算法(Python)第三天 3:链表 为什么需要链表 链表的定义 3.1 单向链表 Python 中赋值的实际意义: 节点实现 单链表的操作 单链表的实现 测试 链表与顺序表的对比 3:链表 ...

  7. 【数据结构与算法】排序优化

    冒泡.插入.选择 O(n^2) 基于比较 快排.归并 O(nlogn) 基于比较 计数.基数.桶 O(n) 不基于比较 总结:如何实现一个通用的高性能的排序函数? 一.如何选择合适的排序算法? 1.排 ...

  8. 【数据结构与算法】排序 冒泡、插入、选择 O(n^2)

    冒泡.插入.选择 O(n2) 基于比较 快排.归并 O(nlogn) 基于比较 计数.基数.桶 O(n) 不基于比较 一.如何分析一个排序算法? 学习排序算法的思路?明确原理.掌握实现以及分析性能. ...

  9. 数据结构和算法之排序一:归并排序

    我们不得不承认一个事实,java学习过程中如果我们掌握了各种编程手段和工具,确实可以做一些开发,这就是一些培训机构敢告诉你几个月就能掌握一门语言的原因.但是随着时间的发展,我们总会感觉,这一类人如果不 ...

最新文章

  1. hibernate-session中的方法
  2. WPF bitmap转bitmapimage 使用 CreateBitmapSourceFromHBitmap内存泄漏
  3. C++命名空间(namespace)
  4. 搭建基于asp.net的wcf服务,ios客户端调用的实现记录
  5. WordPress解析之数据库
  6. SECD machine
  7. 公布一个软件,轻新视频录播程序,H264/AAC录制视音频,保存FLV,支持RTMP直播...
  8. jzoj6067-[NOI2019模拟2019.3.18]More?More!【dp】
  9. 考研政治——选择题判断原则
  10. 阻塞IO, 非阻塞IO, 同步IO,异步IO
  11. centos6.5 安装mono
  12. 设计模式--代理模式Proxy(结构型)
  13. Springboot整合junit单元测试
  14. 带你穿越古罗马,元宇宙巴士来啦 #Invisible Cities
  15. 计算机组成原理第五版磁盘知识点,计算机组成原理知识点总结.doc
  16. 《敏捷个人》周刊 第13期 (可下载)
  17. python 多重类继承__init__
  18. java 基础库_Java基础类库
  19. 通过大数据分析如何提升客户体验
  20. 实验吧-who are you?

热门文章

  1. 一文搞懂C语言回调函数
  2. Opencv--IplImage访问图像像素的值
  3. 随机样本一致性:一种用于图像分析和自动制图的模型拟合模型(3)--(P3P的迭代解)
  4. mysql大数据表无主键_oracle转mysql 表没有主键
  5. CContextMenuManager上下文菜单管理器以及为菜单添加图标
  6. Virtual Treeview 5 0 0的安装以及入门
  7. 【实践驱动开发3-003】TI WL1835MODCOM8 在android的移植 - 软件获取2
  8. 【环境搭建005】UBUNTU13.04 android4.08 源码编译实践中遇到的问题
  9. linux 如何关闭屏幕录像,如何使用GNOME Shell隐藏的屏幕录像工具
  10. 字符串不替代_【数据挖掘】MySQL中的字符串数据类型