简单选择排序 Selection Sort 和树形选择排序 Tree Selection Sort

322人阅读 评论(0) 收藏 举报
分类:

http://www.cnblogs.com/mengdd/archive/2012/11/27/2791412.html

选择排序 Selection Sort

  选择排序的基本思想是:每一趟在剩余未排序的若干记录中选取关键字最小的(也可以是最大的,本文中均考虑排升序)记录作为有序序列中下一个记录。

  如第i趟选择排序就是在n-i+1个记录中选取关键字最小的记录作为有序序列中第i个记录。

  这样,整个序列共需要n-1趟排序。

 

简单选择排序

  一趟简单选择排序的操作为:通过n-i次关键字的比较,从n-i+1个记录中选择出关键字最小的记录,并和第i个记录交换之。

  代码如下:(假设记录为整型,并且关键字为其本身)

Selection Sort

typedef int ElemType;

void SelectSort(ElemType A[],int n)
{
    ElemType temp;

    for(int i=1;i<n;++i)
    {
        int k=i-1;
        for(int j=i;j<n;++j)
        {
            if(A[j]<A[k])
            {
                k=j;
            }
        }

        if(k!=i-1)
        {
            temp=A[i-1];
            A[i-1]=A[k];
            A[k]=temp;
        }
        
    }
}

容易看出,简单选择排序中,所需进行记录移动的操作次数较少,其最小值为“0”,最大值为3(n-1)。

  然而,无论记录的初始序列如何,所需进行的关键字间的比较次数相同,均为n(n-1)/2,因此,总的时间复杂度为O(n2)。

  因为简单选择排序没有利用上次选择时比较的结果,所以造成了比较次数多,速度慢。如果能够加以改进,将会提高排序的速度,所以出现了后面的树形选择排序堆排序

 

树形选择排序

  树形选择排序Tree Selection Sort),又称锦标赛排序Tournament Sort),是一种按照锦标赛思想进行选择排序的方法。

  首先对n个记录的关键字进行两两比较,然后在其中[n/2](向上取整)个较小者之间再进行两两比较,如此重复,直至选出最小关键字的记录为止。

  这个过程可以用一棵有n个叶子结点的完全二叉树表示。如图中的二叉树表示从8个关键字中选出最小关键字的过程:

  

                      

  8个叶子结点中依次存放排序之前的8个关键字,每个非终端结点中的关键字均等于其左、右孩子结点中较小的那个关键字,则根结点中的关键字为叶子结点中的最小关键字

  在输出最小关键字之后,根据关系的可传递性,欲选出次小关键字,仅需将叶子结点中的最小关键字(13)改为“最大值”,然后从该叶子结点开始,和其左右兄弟的关键字进行比较,修改从叶子结点到根结点的路径上各结点的关键字,则根结点的关键字即为次小值

 

 

 

  同理,可依次选出从小到大的所有关键字。

  由于含有n个叶子结点的完全二叉树的深度为[log2n]+1,则在树形选择排序中,除了最小关键字以外,每选择一个次小关键字仅需进行[log2n]次比较,因此,它的时间复杂度为O(nlogn)。

  但是,这种排序方法也有一些缺点,比如辅助存储空间较多,并且需要和“最大值”进行多余的比较。

  为了弥补,另一种选择排序被提出——堆排序


查看评论

选择排序(Selection Sort)原理及Java实现

选择排序(Selection Sort )分为两种 简单选择排序(Simple Selection Sort) 和树形选择排序。 简单选择排序(Simple Selection Sort): 简单...
  • sun_star1chen
  • sun_star1chen
  • 2014-01-16 09:10:01
  • 1656

C++选择排序法(Selection Sort)

// implementation of Selection Sort (C++) #include using namespace std; void SwapTwo(int& a, in...
  • lijialinapple
  • lijialinapple
  • 2014-04-04 17:37:25
  • 2518

数据结构 - 树形选择排序 (tree selection sort) 详解 及 代码(C++)

树形选择排序 (tree selection sort) 详解 及 代码本文地址: http://blog.csdn.net/caroline_wendy算法逻辑: 根据节点的大小, 建立树, 输出树...
  • u012515223
  • u012515223
  • 2014-06-11 11:18:04
  • 2456

c/c++选择排序(SelectionSort)

选择排序原理是,先选取第一个数与其他所有数比较,把比较后的最小的数与第一个数交换,这样每执行一次循环就会将最小的数排到最左边,并且下一次循环比较时就会从第二个数再进行比较,也就是少比较一次,同冒泡排序...
  • gaohuazhao
  • gaohuazhao
  • 2016-06-22 10:48:32
  • 1447

数据结构 - 简单选择排序(simple selection sort) 详解 及 代码(C++)

数据结构 - 简单选择排序(simple selection sort)本文地址: http://blog.csdn.net/caroline_wendy/article/details/286019...
  • u012515223
  • u012515223
  • 2014-06-05 11:56:22
  • 2124

选择排序(Selection Sort)优化

选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。它是不稳定的...
  • u010927640
  • u010927640
  • 2016-12-14 22:28:52
  • 345

排序算法(一)-选择排序(Selection Sort)

C语言实现: // // main.cpp // Cpp_test // // Created by PPPPP_Leung on 16/9/15. // Copyright © 2016年 ...
  • a2824256
  • a2824256
  • 2016-11-30 13:45:41
  • 319

选择排序的伪代码

以下是选择排序的伪代码以及一些分析: SELECTION-SORT(A)                         执行次数 1   for j = 1 to Length(A)      ...
  • xiaochaoqu
  • xiaochaoqu
  • 2013-11-14 16:59:31
  • 2565

Bubble, Insertion, Selection, Quick and Heap Sort

Bubble, Insertion, Selection, Quick and Heap Sort
  • guoxiaojie_415
  • guoxiaojie_415
  • 2015-08-15 15:56:57
  • 931
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 87万+
    积分: 1万+
    排名: 707
    博客专栏
    文章分类
    最新评论