选择排序&&堆排序

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. 发几个Flex的学习资源

    书籍: 目前在看两本 <Essential.ActionScript.3.0> <Flex 4 In Action> 还有两本当手册翻阅,非常喜欢Cookbook这种题材的书, ...

  2. 慕课网-安卓工程师初养成-1-6 MyEclipse的使用简介

    来源 http://www.imooc.com/video/1414 http://www.my-eclipse.cn/ MyEclipse 2014 官方版下载地址  声明:MyEclipse 20 ...

  3. memcached学习(5). memcached的应用和兼容程序

    mixi在提供服务的初期阶段就使用了memcached. 随着网站访问量的急剧增加,单纯为数据库添加slave已无法满足需要,因此引入了memcached. 此外,我们也从增加可扩展性的方面进行了验证 ...

  4. [vsftp]500 OOPS: cannot change directory

    这个报错需要检查 1./etc/passwd 用户的主目录 2./etc/vsftpd/vuser_conf 下每个用户的local_root 3.每个用户目录给ftpuser加上rwx权限,一定要有 ...

  5. Android WebView与JavaScript交互操作(Demo)

    应用场景: 为了使Android移动项目能够在较短的时间内完成开发,同时降低技术人员开发的成本投入,往往会采用Hybrid APP的开发模式.相关Hybrid APP(混合型应用)参看:http:// ...

  6. python常用内置函数

    Python所以内置函数如下: 下面列举一些常用的内置函数: chr()和ord() chr()将数字转换为对应的ascii码表字母 >>> r=chr(65) >>&g ...

  7. CLRS:build_max_heap(strorage in array)

    //用满二叉树存储,从n/2处开始递归向上调整(n/2后均为叶子节点,无需调整)使得根最大 //满二叉树顺序存储,左子2i,右子2i+1: #include<stdio.h>#includ ...

  8. [转载]word尾注插入参考文献——前人经验+自己总结

    1. 以尾注的方式插入第一个参考文献. 将光标定位于word文档中将要插入参考文献的位置,按“插入/引用/脚注和尾注”.出现一菜单,选择“尾注”,“文档结尾”,编号格式为“1,2,3”.按“插入”按钮 ...

  9. JS 随机数

    function GetRandomNum(Min,Max){ var Range = Max - Min; var Rand = Math.random(); return(Min + Math.r ...

  10. ajax 的简单应用

    ajax作为前端技术,采用异步方式,根据其采用的方式来讲,不用刷新界面,只是进行数据的传递. 后台还是用servlet的.servlet接收到ajax的get或post请求后.将数据组装成xml或者j ...