selectionSort

来源:互联网 发布:matlab for mac安装 编辑:程序博客网 时间:2024/05/18 16:13

代码取自网上

选择排序

直接选择排序,

/*******************************************************************************

选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理如下:
首先在未排序序列中找到最小元素,------------------------如何找?
按顺序排出一名选手与剩下的选手进行pk,赢的(比小)取代挑战者的位置,不用从头开始pk,继续从下一位进行pk,直至末尾

存放到排序序列的起始位置,
然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。

复杂度分析:
选择排序的交换操作介于0和(n-1)次之间。选择排序的比较操作为n(n-1)/2次之间。选择排序的赋值操作介于0和3(n-1)次之间。

*************************************************************************************/

void SimpleSelectionSort(int *array, int length){    int i, j;    int temp;    int minimum;    //两个循环语句    for (i = 0; i < length - 1; i++)    {        minimum = i;        //前面有一个for的i锁住,最多只能达到length-1-1        //所以也即j=i+1=》j=length-1        //而且,虽然array[length]已经数组越位,但是循环也已经结束,没有用到a[length]        //进行遍历比较得出最小数,array[minimum] ,下标minimum        for (j = i + 1; j < length; j++)        {            if (array[minimum] > array[j])            {                minimum = j;            }        }        //对此次循环中最小值进行排序        temp = array[i];//中间数        array[i] = array[minimum];//第i个数        array[minimum] = temp;//补回    }}

树型选择排序算法

/*******************************************************************************

在直接选择排序中,进行了一些多余的比较,锦标赛排序(Tournament Sort),也称树型选择排序(Tree Selection Sort),则可以克服这一缺点。
它的基本思想与体育淘汰赛类似,首先取得n个元素的关键字,进行两两比较,得到 n/2 个比较的优胜者,将其作为第一次比较的结果保留下来,然后对这些元素再进行关键值的两两比较,如此重复,直到选出一个关键字最值的对象为止。

也即,上面直接选择排序是通过强行pk比较,强调的是个人英雄注意,树型选择排序是层层选拔(2VS2),你在这个两人小团体中,pk出最强的,不断地向前pk,但是都是2V2的小组赛。当然,这只能选出最强的那一人而已。
复杂度分析:
该算法的时间复杂度为(nlog2n)。但是这种排序方法尚有辅助存储空间较多和进行了多余比较的缺点。

*/

代码就不写出来了。



/*******************************************************************************

堆排序(Heap Sort)是指利用堆(heaps)这种数据结构来构造的一种排序算法。
堆是一个近似完全二叉树结构,并同时满足堆属性:即子节点的键值或索引总是小于(或者大于)它的父节点。堆节点的访问通常堆是通过数组来实现的。

在起始索引为0的实现中:
堆的根节点(即堆的最大值)存放在位置0
节点j的左子节点在位置(2*j+1)
节点j的右子节点在位置(2*j+2)
节点j的父节点在位置floor((j-1)/2)

在起始索引为1的实现中:
堆的根节点(即堆的最大值)存放在位置1
节点j的左子节点在位置(2*j)
节点j的右子节点在位置(2*j+1)
节点j的父节点在位置floor(j/2)


在堆的数据结构中,堆中的最值总是位于根节点。堆中定义了以下几种操作:
删除根节点(delete_max):从堆的根节点处取出数据,然后删除根节点
插入一节点(insert):将一数据插入堆中
删除一节点(delete):将一数据从堆中删除

在堆中进行了上述操作后,堆的特殊属性可能发生变化。例如,当在堆尾插入一个数据,它可能小于它的父节点,因而需要进行一系列的置换操作,调整它的位置,从而保持堆的特有属性。
和此相关的操作包括:
筛选上移(sift_up):给定某个数据后,将其上移到相应的位置,从而保证其值不大于父节点。
筛选下移(sift_down):给定某个数据后,将其下移到相应的位置,从而保证其值不大于父节点。

堆排序的平均时间复杂度为O(n log n),空间复杂度为Θ(1)。

其实,堆排序,和树型差不多。树型是2V2的小组赛,堆是三人的群赛,在三人中选出一人,最强的那一人抢夺了宝座,以争取和别的赛区的选手进行比拼,也是三人的群赛,最终争夺武林盟主,当然,这只能选出最强的一人,最强之人隐居,再选出最强之前,这样就可以排序了。

*/


以上,只是一些大概的思想,具体的实现,算法的优势,使用场合,还有待研究。