`
yuanzher
  • 浏览: 29931 次
  • 性别: 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)。

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

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

分享到:
评论

相关推荐

    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 ...

    leetcode中文版-ts-datastructures-algorithms:和我一起学算法吧!

    选择排序(Selection Sort) 插入排序(Insertion Sort) 快速排序(Quick Sort) 希尔排序(Shell Sort) 归并排序(Merge Sort) 堆排序(Heap Sort) 计数排序(Counting Sort) 桶排序(Bucket Sort) 基数排序...

    普林斯顿算法课程 Robert Sedgewick

    insertion sort, shell sort, quick sort, merge sort, heap sort), searching algorithms (Binary search tree, Red-Black BST, hashing), 所以程序都用java实现,代码风格简洁,很值得学习。

    leetcode22题-play-with-data-structure-python:使用python数据结构(数组,链表,堆栈,二叉树,并

    leetcode22题 My data structure and Algo in python I will put my solutions all data structure and algo ...Sort ...Tree 二分搜索树 ...Tree 线段树 ...Tree 红黑树 ...排序基础 ...选择排序 - Selection Sort 1

    数据结构常用算法c++实现

    Selection sort Insertion sort Radix sort Quick sort Merge sort Heap sort Double linked list Skip list Self-organized linked-list ops (move-to-front, move-ahead-one) Largest common sequence Binary ...

    全面的算法代码库

    线段树维护区间和值 Segment-Tree(Sum) 普通的选择算法 Selection Eratosthenes素数筛法 Sieve-of-Erotosthenes 指针版的单向链表 Singly-Linked-List(Pointer) 跳表 Skip-List ST表 Sparse-Table 伸展树 ...

    学习数据结构算法必备

    (1)在二叉排序树上进行查找(bstsrch)、插入结点(ins_bstree)和删除结点(del_bstree) (2)在二叉平衡树上插入结点(ins_AVLtree) 和删除结点(del_AVLtree) (3)在 B-树上插入结点(Ins_BTree) 和 删除结点(Del_...

    严蔚敏 数据结构算法演示(Windows版)软件

    (1)在二叉排序树上进行查找(bstsrch)、插入结点(ins_bstree)和删除结点(del_bstree) (2)在二叉平衡树上插入结点(ins_AVLtree) 和删除结点(del_AVLtree) (3)在 B-树上插入结点(Ins_BTree) 和 删除结点(Del_...

    数据结构算法演示(Windows版)

    (1)在二叉排序树上进行查找(bstsrch)、插入结点(ins_bstree)和删除结点(del_bstree) (2)在二叉平衡树上插入结点(ins_AVLtree) 和删除结点(del_AVLtree) (3)在 B-树上插入结点(Ins_BTree) 和 删除结点(Del_...

    Data.Structures.and.Algorithms.USING.C

    23. Selection Sort 24. Merge Sort Algorithm 25. Shell Sort 26. Quick Sort GRAPH DATA STRUCTURE 27. Graphs 28. Depth First Traversal 29. Breadth First Traversal TREE DATA STRUCTURE 30. Tree 31. Tree ...

    c语言数据结构算法演示(Windows版)

    (1)在二叉排序树上进行查找(bstsrch)、插入结点(ins_bstree)和删除结点(del_bstree) (2)在二叉平衡树上插入结点(ins_AVLtree) 和删除结点(del_AVLtree) (3)在 B-树上插入结点(Ins_BTree) 和 删除结点(Del_...

    用c描述的数据结构演示软件

    (1)在二叉排序树上进行查找(bstsrch)、插入结点(ins_bstree)和删除结点(del_bstree) (2)在二叉平衡树上插入结点(ins_AVLtree) 和删除结点(del_AVLtree) (3)在 B-树上插入结点(Ins_BTree) 和 删除结点(Del_...

    数据结构演示软件

    (1)在二叉排序树上进行查找(bstsrch)、插入结点(ins_bstree)和删除结点(del_bstree) (2)在二叉平衡树上插入结点(ins_AVLtree) 和删除结点(del_AVLtree) (3)在 B-树上插入结点(Ins_BTree) 和 删除结点(Del_...

    leetcode2sumc-dsa:使用golang练习DSA

    SelectionSort 3. InsertionSort 4. HeapSort - Library Implementation - Custom Implementation 5. QuickSort 6. MergeSort 链表 1. InsertAtEnd 2. InsertAtBeginning 3. InsertAtPos 4. DeleteAtEnd 5. ...

    Radmin自动登录器v3.0

    * 记录窗格和目录树窗格都支持鼠标拖放功能,强烈建议用户使用该功能前备份RadminM.txt,以免损坏或丢失数据;直接鼠标拖放为移动,Ctrl+鼠标拖放为复制。拖放时状态栏有提示信息; * 程序启动时,记录自动按记录...

    华南理工大学计算机全英班算法设计实验

    3)The results should be compared with ones of other algorithms, such as: Straight selection sort, insert sort, Heapsort, etc., and draw the graph to find their differences. Figure 1 The difference ...

    R Data Structures and Algorithms [AZW3/MOBI/EPUB/PDF(conv)]

    We will also explore the application of binary search and will go in depth into sorting algorithms such as bubble sort, selection sort, insertion sort, and merge sort. Style and approach This easy-...

    算法导论_英文第三版

    2.1 Insertion sort 16 2.2 Analyzing algorithms 23 2.3 Designing algorithms 29 3 Growth of Functions 43 3.1 Asymptotic notation 43 3.2 Standard notations and common functions 53 4 Divide-and-Conquer 65...

Global site tag (gtag.js) - Google Analytics