选择类排序

来自姬鸿昌的知识库
Jihongchang讨论 | 贡献2022年9月23日 (五) 11:01的版本 (建立内容为“ ===5)直接选择类排序=== https://www.bilibili.com/video/BV1hg411V7Bm/?p=70 过程:首先在所有记录中选出排序码最小的记录,把它与第…”的新页面)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

5)直接选择类排序

https://www.bilibili.com/video/BV1hg411V7Bm/?p=70

过程:首先在所有记录中选出排序码最小的记录,把它与第1个记录交换,然后再其余的记录内选出排序码最小的记录,与第2个记录交换......依次类推,直到所有记录排完为止。

直接选择排序.png
void selectSort(int data[], int n)
{
    //对data[0]~data[n-1]中的n个整数按非递减有序的方式进行排列
    int i,j,k;
    int temp;
    for(i = 0; i < n - 1; i++)
    {
        for(k = i, j = i + 1; j < n; j++) //k表示data[i]~data[n-1]中最小元素的下标
        {
            if(data[j] < data[k]) {
                k = j;
            }
            if(k!=i){
                //将本趟找出的最小元素与data[i]交换
                temp=data[i];
                data[i]=data[k];
                data[k]=temp;
            }
        }//end inner for
    }//end outter for
}

4)堆排序

设有n个元素的序列{K1,K2,...,Kn},当且仅当满足下述关系之一时,称之为堆。

(1)Ki≤K2i且Ki≤K2i+1;(父结点总是小于孩子结点)

(2)Ki≥K2i且Ki≥K2i+1。(父结点总是大于孩子结点)

其中(1)称为小顶堆/小根堆,(2)称为大顶堆/大根堆

小顶堆和大顶堆.png
堆排序过程.png

堆排序的时间复杂度为:O(nlog2n)

考点:大顶堆和小顶堆

对于n个元素的关键字序列{K1,K2,...,Kn},当且仅当满足Ki≤K2i且Ki≤K2i+1(1<i<n/2),则称该序列为小顶堆。

若将其中的“≤”换为“≥”则称其为大顶堆。

由此可知,()是大顶堆。

A、7,2,3,4,5,6,1

B、7,5,4,2,6,3,1

C、7,6,4,2,5,3,1 √

D、7,5,3,1,6,4,2

解:

选项中的数列就是0,1,2,3,4,5,6作为i参数,按4个选项中的序列顺序画树,看哪个符合大顶堆的定义:Ki≥K2i且Ki≥K2i+1

A

7
2 3
4

2作为4的父结点却小于4,所以不是大顶堆。


B

7
5 4
2 6

5作为6的父结点却小于6,所以不是大顶堆。


C

7
6 4
2 5 3 1

父结点均大于子节点,符合大顶堆的定义。


D

7
5 3
1 6

5作为6的父结点却小于6,所以不是大顶堆。