`
yuanzher
  • 浏览: 30942 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

 
阅读更多

选择排序 Selection Sort

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

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

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

 

简单选择排序

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

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

复制代码
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)。

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

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

分享到:
评论

相关推荐

    高级数据结构设计-树形选择排序TreeSelcetSort&线段树-内含源码和说明书.zip

    Tree_Selection_Sort.c文件包含了树形选择排序的实现代码,通过阅读和分析代码,可以深入理解其工作原理。 二、线段树SegmentTree 线段树是一种树形数据结构,常用于区间查询和更新操作。它能以O(logn)的时间...

    各种排序方法---源代码

    8. 树形选择排序 (Tree Selection Sort) 树形选择排序是基于选择排序的一种改进算法,使用二叉堆结构进行选择。虽然避免了原选择排序的连续交换,但仍然有较高的交换次数,时间复杂度为O(n^2)。 以上这些排序算法各...

    java中常见排序的所有demo,包含冒泡,选择,插入,快速,堆,希尔,二叉树等

    5. **堆排序(Heap Sort)**:堆排序是一种树形选择排序,是对直接选择排序的有效改进。堆是一个近似完全二叉树的结构,并且满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。 6. **希尔排序...

    最经典的8大排序算法总结

    2. 选择排序(Selection Sort): 选择排序算法是一种原址比较排序算法。选择排序的思路是:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小(大)元素,...

    计算机专业一些常见排序方法的算法实现

    2. 选择排序(Selection Sort): 选择排序是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 3. 堆排序...

    c++实现12个排序算法以及时间比较

    2. **选择排序(Selection Sort)** 选择排序每次找到最小(或最大)的元素与第一个元素交换,然后在剩余元素中寻找最小元素与第二个元素交换,以此类推。同样具有O(n²)的时间复杂度。 3. **插入排序(Insertion ...

    c实现十种排序算法

    8. **Trie树**(Trie Tree):虽然不直接属于排序算法,但它是数据结构的一种,常用于字符串查找和排序,特别是当需要快速查找和插入时。 9. **Sunday排序**(Sunday Sort):一种线性时间复杂度的排序算法,主要...

    各种排序算法的C++模板类实现

    #### 二叉排序树排序(Binary Search Tree Sort) 二叉排序树排序是一种基于二叉树的排序算法。这种排序方式是先将输入序列构造成一棵二叉排序树,再对该树进行中序遍历来获取排序好的序列。 - **算法步骤**: 1....

    关于排序问题

    二叉树排序(Binary Tree Sort)和鸽巢排序(Pigeonhole Sort)也有O(n log n)的时间复杂度,而基数排序(Radix Sort)的时间复杂度为O(n·k),它适用于整数排序且需要O(n)的额外空间。Gnome Sort和Library Sort则...

    常用排序、查找算法及栈、二叉树基本算法

    **选择排序(Selection Sort)** 选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序的...

    c语言经典排序算法(8种-含源代码)

    void selectionSort(int A[], int n) { int i, j, min, temp; for (i = 0; i ; i++) { min = i; for (j = i + 1; j ; j++) { if (A[min] &gt; A[j]) { min = j; } } temp = A[i]; A[i] = A[min]; A[min] = ...

    C语言的各种排序及查找的算法

    2. **选择排序(Selection Sort)**:每次找出未排序部分的最小(或最大)元素,放到已排序部分的末尾。C语言中,可以使用一个辅助变量来保存当前未排序部分的最小值索引。 3. **插入排序(Insertion Sort)**:将...

    选择排序原理及Java实现

    选择排序是一种基础的排序算法,主要分为简单选择排序和树形选择排序两种。本文将详细介绍这两种选择排序的原理以及它们的Java实现。 首先,我们来看简单选择排序(Simple Selection Sort)。这种排序方法与冒泡...

    Java 实例 - 数组排序及元素查找源代码-详细教程.zip

    2. **选择排序(Selection Sort)**:每次选取未排序部分的最小(或最大)元素放到已排序部分的末尾,直到所有元素都排好序。 3. **插入排序(Insertion Sort)**:将元素逐个插入到已排序部分的正确位置,适合小...

    经典的算法

    #### 树形选择排序(Tree Selection Sort) 树形选择排序是一种基于树结构的选择排序方法,通过构建一棵特殊的树来选择待排序元素,进而实现排序。 ### 搜索算法 #### 深度优先搜索(Depth-First Search) 深度...

    常用排序算法分析与实现(Java版)

    public void selectionSort(E[] array) { for (int i = 0; i ; i++) { int minIndex = i; for (int j = i + 1; j ; j++) { if (array[j].compareTo(array[minIndex]) ) { minIndex = j; } } swap(array, i, ...

    sorting-algorithms:专为开源初学者打造的适合初学者的存储库。 将任何语言的任何排序算法添加到此存储库

    Binary Insertion Sort Bucket Sort Cycle Sort K Way Merge Sort Radix Sort Tree Sort PigeonholeSort Tree Sort C Bubble Sort Insertion Sort Merge Sort Quick Sort Selection Sort Bubble Sort #2 Gnome Sort ...

    翻译JavaScriptalgorithms算法与数据结构

    1. 排序算法:快速排序(Quick Sort)、归并排序(Merge Sort)、冒泡排序(Bubble Sort)、选择排序(Selection Sort)和插入排序(Insertion Sort)。这些算法各有优缺点,适用于不同的场景,例如,快速排序在...

    华师网络学院作业答案-数据结构选择题.pdf

    - 插入排序(Insertion Sort)、选择排序(Selection Sort)和希尔排序(Shell Sort)不是总与原始状态有关,它们有固定的步骤。 2. **二叉树和森林到二叉树的转换**: - 森林F包含三棵树,每棵树的节点数量分别...

    数据结构与算法常用英语词汇[整理版].doc

    * 选择排序(Selection Sort):是一种简单的排序算法,通过选择最小或最大元素实现排序。 * 插入排序(Insertion Sort):是一种简单的排序算法,通过插入元素实现排序。 * 归并排序(Merge Sort):是一种高效的...

Global site tag (gtag.js) - Google Analytics