选择排序&&堆排序

1.选择排序:

  介绍:选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

  步骤:假设数组array长度为N即有数组内有N个数据未排序数据

  1.第一趟遍历将这N个数据中最小的数据和array[0]交换。

  2.第二趟则遍历N-1个数据,将这N-1个数据中最小的和array[1]交换(第二趟中的数组是从原数组中的array[1]开始即排除第一趟中最小的数据再进行交换)。

  ...

  程序实现:

方法1:每趟选择最小数据进行交换

 void SelectSort(int* _array, size_t _arraySize)
{
assert(_array&&_arraySize);
for (size_t i = ;i < _arraySize;++i)
{
int MinIndex = i;//记录首位置下标
for (size_t j = i + ;j < _arraySize;++j)
{
if (_array[MinIndex] > _array[j])//比较首位置之后的各个元素并将最小数据的下标赋给MinIndex
MinIndex = j;
}
//if (MinIndex != i)//防止首元素即最小时进行交换,减少不必要开销
swap(_array[MinIndex], _array[i]);
}
return;
}

方法2:与方法一类似,进行了优化,每趟将最小数据置首,将最大元素置尾

 void SelectSort_optimize(int* _array, int _arraySize)
{
assert(_array&&_arraySize); int left = ;
int right = _arraySize - ;
for (;left <= right;++left,--right)//每一趟找到最大值和最小值减少循环次数
{
int MinIndex = left;
int MaxIndex = right;
for (int index = left;index <= right;++index)//此时数组为闭区间,与未优化时存在差异
{
if (_array[MinIndex] > _array[index])
MinIndex = index;
if (_array[MaxIndex] < _array[index])
MaxIndex = index;
}
if (left != MinIndex)
{
swap(_array[left], _array[MinIndex]);
if (left == MaxIndex)//避免如果最大值为_array[left]时,将被上一步操作移到_array[MinIndex]后出错
MaxIndex = MinIndex;//将MaxIndex更新
}
if (right != MaxIndex)
swap(_array[right], _array[MaxIndex]);
}
return;
}

效率分析:

  算法稳定性:不稳定

  时间复杂度:O(n^2)

  空间复杂度:O(1)

2.堆排序
  介绍:堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大堆和小堆,是完全二叉树。升序排序时使用大堆,降序排序时使用小堆。

步骤:对数组_array进行升序排序,假设数组array长度为N即有数组内有N个数据未排序数据

    1:将_array中的N个数据构成大堆后,此时最大值即为_array[0],然后将_array[0]与_array[N-1]交换。

   2:除_array[N-1]外,其余数据继续建立大堆后,此时最大值仍为_array[0],然后将_array[0]与_array[N-2]交换。

   ...

  根据下面网址演示可以清楚理解堆排序的过程

http://www.tyut.edu.cn/kecheng1/site01/suanfayanshi/heap_sort.asp

 程序实现:

 void AdjustDown(int* _arr,size_t ParIndex,int _arrSize)//从父节点开始向下调整
{
size_t ChildIndex = ParIndex * + ;//找出父节点的左子树下标 while (ChildIndex < _arrSize)
{
if ((_arr[ChildIndex] < _arr[ChildIndex + ]) && ((ChildIndex + ) < _arrSize))//找出父节点的左右子树中的较大值的下标
ChildIndex++;
if (_arr[ParIndex] < _arr[ChildIndex])
{
swap(_arr[ParIndex], _arr[ChildIndex]);//如果父节点数据小于子节点数据则交换
ParIndex = ChildIndex; //继续调整交换后的子树,保证堆中任意子树均为大堆
ChildIndex = ParIndex * + ;
}
else//如果_arr[ParIndex] > _arr[ChildIndex]则说明其已经为大堆且子树也为大堆,跳出循环
break;
}
}
void HeapSort(int* _array, int _arraySize)
{
assert(_array&&_arraySize > );
//建堆
for (int i = _arraySize / - ;i >= ;--i)//从最后一个非叶子节点开始向下调整直到根节点调整完
AdjustDown(_array, i, _arraySize); for (int j = _arraySize - ;j > ;--j)
{
swap(_array[], _array[j]);
AdjustDown(_array, ,j);
}
return;
}

下面是当数组为{3,12,24,2,6}时的排序过程

效率分析:

  算法稳定性:不稳定

  时间复杂度:O(n^lg n)

  空间复杂度:O(1)

排序 选择排序&&堆排序的更多相关文章

  1. 跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)

    跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort) 选择排序(selection sort) 算法原理:有一筐苹果,先挑出最大的一个放在最后,然后 ...

  2. 内部排序->选择排序->堆排序

    文字描述 堆排序中,待排序数据同样可以用完全二叉树表示, 完全二叉树的所有非终端结点的值均不大于(或小于)其左.右孩子结点的值.由此,若序列{k1, k2, …, kn}是堆,则堆顶元素(或完全二叉树 ...

  3. java实现 排序算法(鸡尾酒排序&选择排序&插入排序&二分插入排序)

    1.鸡尾酒排序算法 源程序代码: package com.SuanFa; public class Cocktial {    public static void main(String[] arg ...

  4. JAVA排序--[选择排序]

    package com.array; public class Sort_Select { /** * 项目名称:选择排序 ; * 项目要求:用JAVA对数组进行排序,并运用选择排序算法; * 作者: ...

  5. C-冒泡排序,选择排序,数组

    ——构造类型 ->数组      ->一维数组      ->相同类型的一组数据      ->类型修饰符--数组名—[数组的元素个数(必须是整型表达式或者是整型常量,不能是变 ...

  6. 内部排序->选择排序->树形选择排序

    文字描述 树形选择排序又称锦标赛排序; 比如,在8个运动员中决出前3名至多需要11场比赛, 而不是7+6+5=18场比赛(它的前提是甲胜乙,乙胜丙,则甲必能胜丙) 首先对n个记录的关键字进行两两比较, ...

  7. 内部排序->选择排序->简单选择排序

    文字描述 简单排序的基本思想是:每一趟在n-i+1(i=1,2,…,n)个记录中选取关键字最小的记录作为有序列表中的第i个记录. 示意图 略 算法分析 简单排序算法中,所需进行记录移动的操作次数较少, ...

  8. 排序——选择排序(java描述)

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

  9. [javaSE] 数组(排序-选择排序)

    两层嵌套循环,外层循环控制次数,内层循环进行比较 for(int x=0;x<arr.length;x++){ for(int y=0;y<arr.length;y++){ if(arr[ ...

随机推荐

  1. JavaScript内置对象

    对象概述 JavaScript是一种基于对象的脚本语句,而不是面向对象的编程语言.对象就是客观世界存在的实体,具有属性和方法两方面特性. 访问对象的属性和方法的方式如下: 对象名.属性 对象名.方法名 ...

  2. windows 10 笔记本关机不断电解决

    右键我的电脑-->管理-->设备管理器-->系统设备 找到Intel(R) Management Engine Interface  双击打开,禁用,确定,完事 原因,该驱动11.0 ...

  3. TCP/IP详解学习笔记(9)-- 广播,多播,IGMP:网际组管理协议

    1.概述      IP有三种地址:单播地址, 广播地址,多播地址.      广播和多播仅应用于UDP.      每个以太网帧包含源主机和目的主机的以太网地址.通常每个以太网帧发往单个目的主机,目 ...

  4. Java基础类库

    1 main方法      运行java程序的参数:   下面详细讲解main 方法为什么采用这个方法签名 1.public 修饰符:Java类由jvm调用,为了让jvm可以自由调用这个main()方 ...

  5. 用命令实现Win7远程桌面关机和重启

    关机 shutdown -s -t 0 重启 shutdown -r -t 0 打开运行框(Win+R键),输入上述命令即可,后面的数字表示关机/重启延迟的时间 at 12:00 shutdown - ...

  6. [Nginx 1] Nginx简介

    导读:现在项目中用到这个Nginx了,本来是想着把代码调通了就得了.想想还是花点时间总结总结,就利用门卫思维吧.今天主要是一个整体的介绍,然后在学习的过程中,接着总结Nginx的其他使用事宜. 一.什 ...

  7. ECSHOP如何解决Deprecated: preg_replace()报错 Home / 开源程序 / ECSHOP / ECSHOP如何解决Deprecated: preg_replace()报错

    Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in D:\w ...

  8. Qt, 我回来了。。。

    说起qt,大学时就有接触,但一直没有深入,这个周六周天利用两于时间重新温习了一下,跟之前用过的vs上的MFC.C++ builder比起来,Qt封装很人性化,库也比较全,写个 一般的小工具很轻松. 参 ...

  9. Android WebRTC 音视频开发总结(三)-- 信令服务和媒体服务

    前面介绍了WebRTCDemo的基本结构,本节主要介绍WebRTC音视频服务端的处理,,转载请说明出处(博客园RTC.Blacker). 通过前面的例子我们知道运行WebRTCDemo即可看到P2P的 ...

  10. php-resque学习笔记二(配置)

    1:前提 系统:CentOS PHP版本:PHP7     安装目录:/usr/local/php php-resque          安装目录:/home/software/php-resque ...